【问题标题】:What are the alternatives to Perl interpreter threads?Perl 解释器线程的替代方案是什么?
【发布时间】:2015-07-15 08:43:03
【问题描述】:

perldoc threads 说:

官方不鼓励在 perl 中使用基于解释器的线程。

还有其他基于 Perl 的线程吗?还是我们不应该在 Perl 中使用线程?

【问题讨论】:

标签: multithreading perl


【解决方案1】:

据我所知,没有任何可靠的线程实现。您应该坚持使用一些基于事件的模块,例如CoroAnyEventIO::Async 等。

【讨论】:

  • 只是因为文档不清楚,Coro 是一个协作式多任务系统。如果您想使用线程来跨内核分配 CPU 负载,那将无济于事。任何都不是基于事件的系统。当大多数任务都花在等待外部事件上时,它们很有用。
  • Perl 线程非常可靠。如果您来自其他语言,它们只是不是您可能期望的轻量级线程。
  • 从 perl 5.22 起不支持las、Coro 和 AnyEvent。
【解决方案2】:

那个警告是罂粟花。它应该被删除。 Perl 的开发人员解释说,这意味着“如果你想要一个轻量级的多任务系统,官方不鼓励在 perl 中使用基于解释器的线程。

由于创建新线程的成本可能很高,因此只需使用涉及可重用工作线程的模型。

【讨论】:

  • 确实如此。我发现的最大“缺陷”是假设它们是轻量级的,就像它们在其他一些语言中一样。
【解决方案3】:

取决于您要完成的工作。我仍然广泛使用线程,它们并没有什么大问题。

它们最大的问题是它们不是轻量级的,如果您使用其他语言进行线程化,您可能会期望它们是轻量级的。

它们恰恰相反——产生一个线程就像重新开始你的代码,但有一些对 IPC 有用的钩子。这意味着你真的不想像你想的那样做一个每线程任务模型的程序。

相反,Thread::Queue 工作线程样式模型会更好地为您服务。这是一个例子: Perl daemonize with child daemons

但是,您可能想考虑使用fork 作为替代方案。 fork - 因为它是在 Unix 上实现的 - 是一个非常有效的系统调用,并且对于产生新进程非常有效。 缺点是 - 它对 IPC 不太友好。

Parallel::ForkManager 是我喜欢为多处理进行分叉的一个模块。

但无论哪种情况,您都应该注意 - 多处理不是灵丹妙药。它可以让你占用更多的 CPU如果你有正确的问题要解决。它不会让你的磁盘运行得更快:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 2021-11-13
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多