gpt4 book ai didi

perl - 如何用 Perl 编写并行程序?

转载 作者:行者123 更新时间:2023-12-02 10:26:24 24 4
gpt4 key购买 nike

我必须在一个 Perl 脚本中执行多项任务。最好不要使用forkthread

  1. 任务 A:每 5 秒向服务器发出 HTTP 请求。无穷大且不应被阻挡。如果得到:

    1. 'TASK',任务A会调用一个耗时的子进程,那么如何避免赋值执行 block 任务A的循环呢?
    2. “PAUSE”,暂停请求
    3. “更新”,告诉任务 B 做某事
    4. 从任务B或任务C收到数据时向服务器发出POST请求
  2. 任务 B:每 1 分钟发出一次 mysql 请求,并根据结果告诉任务 A 执行 POST 请求

  3. 任务 C:接受套接字连接并告诉任务 A 或 B 执行某些操作。

三个并行的不定式循环进程,并且会互相通信。我怎样才能做到这一点?

最佳答案

这种设计毫无意义,并且最好不要使用线程或子进程的说法更没有意义。

您有三个请求来源:

  • 请求源 A:每 5 秒向服务器发出一次 Web 请求。
  • 请求源 B:每 60 秒向服务器发出数据库请求。
  • 请求源 C:接受来自套接字的请求。

为每个请求源创建一个线程。他们的工作只是监视每个请求源,以确保在应该检查源时检查源。因此,这些线程都不应该做任何实际工作。如果必须执行某项任务,它们会将工作委托(delegate)给工作线程。他们不发布任何内容。他们不写入数据库。

实际任务(包括发送 POST 和写入数据库)由一个或多个工作线程(您的选择)执行。工作线程从由三个请求源填充的单个 Thread::Queue 队列接收请求。

<小时/>

所以代码看起来像:

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

{
my $request_q = Thread::Queue->new();

my %job_handlers = (
post => \&post_handler,
...
);

for (1..NUM_WORKERS) {
async {
while (1) {
my $job = $request_q->dequeue();
my ($job_type, @args) = @$job;
my $handler = $job_handlers{$job_type};
or do { warn("Unknown job type $job_type"); next };
$handler->(@args);
}
};
}

async { poll_web($request_q); };
async { poll_db($request_q); };
accept_connections($request_q);
}
<小时/>

如果你想使用进程而不是线程,请更改

use threads;

use forks;

但继续使用 Thread::Queue。

关于perl - 如何用 Perl 编写并行程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16910689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com