【问题标题】:Perl threading modelPerl 线程模型
【发布时间】:2014-03-01 07:35:26
【问题描述】:
  • 我有 100 多个任务要做,我可以循环执行,但这会很慢
  • 我想通过线程来完成这些工作,比如说 10 个线程
  • 作业之间没有依赖关系,每个作业都可以独立运行,失败则停止
  • 我想让这些线程来接我的工作去做,总共不要超过10个线程,否则可能会伤害服务器
  • 这些线程一直在做这些工作,直到全部完成
  • 超时时停止线程中的作业

我在网上搜索这方面的信息,Threads::PoolThreads::Queue... 但我不能确定哪一个更适合我的情况。谁能给我一些建议?

【问题讨论】:

  • 作业会产生什么输出?文件?内存数据?如果是后者,它有多大/结构如何? Windows 还是非 Windows?
  • 作业在应用服务上做down/up动作,不需要捕获输出,不需要文件输入,我需要做的就是将服务名称传递给函数,然后让命令停止/启动它。抱歉,我忘了说,它是在 Linux 上运行的
  • 那我就用 Parallel::ForkManager。
  • 谢谢你的建议,我试试看

标签: multithreading perl


【解决方案1】:

您可以使用 Thread::Queue 和线程。

IPC(线程之间的通信)更容易在进程之间进行。

To fork or not to fork?

use strict;
use warnings;

use threads;
use Thread::Queue;

my $q = Thread::Queue->new();    # A new empty queue

# Worker thread
my @thrs = threads->create(sub {
                            while (my $item = $q->dequeue()) {
                                # Do work on $item
                            }
                         })->detach() for 1..10;#for 10 threads
my $dbh = ...
while (1){
  #get items from db
  my @items = get_items_from_db($dbh);
  # Send work to the thread
  $q->enqueue(@items);
  print "Pending items: "$q->pending()."\n";
  sleep 15;#check DB in every 15 secs
}

【讨论】:

  • 谢谢。我会在办公室研究它。很多人问我用fork,fork over thread的adv是什么?它会消耗更多的系统资源吗?
【解决方案2】:

我永远不会使用 perl 线程。原因是它们在概念上不是线程:您必须指定要在线程之间共享哪些数据。每个线程运行一个 perl 解释器。这就是为什么它们被称为解释器线程或 ithreads。不用说,这会消耗大量内存来并行运行。 fork() 共享所有内存直到分叉点。因此,如果它们是独立的任务,请始终使用 fork。这也是最 Unix 的做事方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2019-04-21
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多