Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用Perl编写并行程序?_Perl - Fatal编程技术网

如何用Perl编写并行程序?

如何用Perl编写并行程序?,perl,Perl,我必须在一个Perl脚本中完成几个任务。最好不要使用fork或thread 任务A:每5秒向服务器发出HTTP请求。无限大,不应被阻止。如果得到: “任务”,任务A将调用一个耗时的子进程,那么如何避免分配执行阻塞任务A的循环呢 “暂停”,暂停请求 “更新”,告诉任务B做点什么 从任务B或任务C接收数据时向服务器发出POST请求 任务B:每1分钟进行一次mysql请求,根据结果,将告诉任务A进行POST请求 任务C:接受套接字连接并告诉任务A或B做些什么 三个并行不定式循环进程,并将相互通信。我

我必须在一个Perl脚本中完成几个任务。最好不要使用
fork
thread

  • 任务A:每5秒向服务器发出HTTP请求。无限大,不应被阻止。如果得到:

  • “任务”,任务A将调用一个耗时的子进程,那么如何避免分配执行阻塞任务A的循环呢
  • “暂停”,暂停请求
  • “更新”,告诉任务B做点什么
  • 从任务B或任务C接收数据时向服务器发出POST请求
  • 任务B:每1分钟进行一次mysql请求,根据结果,
    将告诉任务A进行POST请求

  • 任务C:接受套接字连接并告诉任务A或B做些什么


  • 三个并行不定式循环进程,并将相互通信。我该怎么做

    这种设计毫无意义,而不使用线程或子进程更好的说法就更没有意义了

    您有三个请求来源:

    • 请求源A:每5秒向服务器发出web请求
    • 请求源B:每60秒向服务器发出数据库请求
    • 请求源C:接受来自套接字的请求
    为每个请求源创建一个线程。他们的工作只是监视每个请求源,以确保在应该检查源时检查源。因此,这些线程都不应该做任何实际工作。如果必须执行任务,他们会将工作委派给工作线程。他们什么也不发。它们不会写入数据库

    实际任务(包括发送帖子和写入数据库)由一个或多个工作线程(由您选择)执行。工作线程从由三个请求源填充的单个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
    


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

    use threads;
    


    但是继续使用Thread::Queue。

    fork
    或therad有什么问题?它们是为这类东西而设计的。我实际上在这里使用线程,因为通过队列进行通信非常简单,并且可以选择非阻塞。如果使用
    fork
    ,则可以通过管道(连接的文件句柄)进行通信。如果将每个任务放在单独的脚本中,则可以使用命名管道或套接字。这要复杂得多。至少对于任务A,您可以使用线程来实现非阻塞属性(例如,五个http工作线程执行请求,足够多的工作线程用于耗时的子任务)为什么任务A需要执行1.4???您也可以针对此类事情…或Coro或AnyEvent或。。。让事情简单一点怎么样?+1感谢你有耐心写出一个比单个问题更适合的答案。谢谢
    use threads;
    
    use forks;