如何用Perl编写并行程序?
我必须在一个Perl脚本中完成几个任务。最好不要使用如何用Perl编写并行程序?,perl,Perl,我必须在一个Perl脚本中完成几个任务。最好不要使用fork或thread 任务A:每5秒向服务器发出HTTP请求。无限大,不应被阻止。如果得到: “任务”,任务A将调用一个耗时的子进程,那么如何避免分配执行阻塞任务A的循环呢 “暂停”,暂停请求 “更新”,告诉任务B做点什么 从任务B或任务C接收数据时向服务器发出POST请求 任务B:每1分钟进行一次mysql请求,根据结果,将告诉任务A进行POST请求 任务C:接受套接字连接并告诉任务A或B做些什么 三个并行不定式循环进程,并将相互通信。我
fork
或thread
将告诉任务A进行POST请求
三个并行不定式循环进程,并将相互通信。我该怎么做 这种设计毫无意义,而不使用线程或子进程更好的说法就更没有意义了 您有三个请求来源:
- 请求源A:每5秒向服务器发出web请求
- 请求源B:每60秒向服务器发出数据库请求
- 请求源C:接受来自套接字的请求
所以代码看起来像:
use threads;
use Thread::Queue qw( );
use constant NUM_WORKERS => 5; # Tweak this. Can be as low as 1.
sub poll_web {
my ($request_q) = @_;
... init ...
while (1) {
...
$request_q->enqueue([post => ...]);
...
}
}
sub poll_db { ... } # Just like poll_web
sub accept_connections { ... } # Just like poll_web
sub post_handler { ... } # Receives args passed to enqueue
如果要使用进程而不是线程,请更改
use threads;
到
但是继续使用Thread::Queue。fork或therad有什么问题?它们是为这类东西而设计的。我实际上在这里使用线程,因为通过队列进行通信非常简单,并且可以选择非阻塞。如果使用
fork
,则可以通过管道(连接的文件句柄)进行通信。如果将每个任务放在单独的脚本中,则可以使用命名管道或套接字。这要复杂得多。至少对于任务A,您可以使用线程来实现非阻塞属性(例如,五个http工作线程执行请求,足够多的工作线程用于耗时的子任务)为什么任务A需要执行1.4???您也可以针对此类事情…或Coro或AnyEvent或。。。让事情简单一点怎么样?+1感谢你有耐心写出一个比单个问题更适合的答案。谢谢
use threads;
use forks;