【问题标题】:Perl-Threads: share GLOB between threadsPerl-Threads:在线程之间共享 GLOB
【发布时间】:2018-07-15 07:03:29
【问题描述】:

我尝试在 Perl 中创建一个并行处理的网络服务器。

监听不是纯套接字——所以没有文件句柄,它是一个实现 HTTP 服务器(GLOB)的对象。

接受后,我再次获得一个用于客户端连接的 GLOB。

由于 GLOB,我无法通过 thead::shared 将其传递给工作线程。

我可以动态创建踏板并通过参数将其提供给它们。但是创建线程对性能不利,所以我喜欢有一个固定的已经在等待的工作人员池。

那么如何以优雅的方式将 GLOB 传递给已经运行的线程呢? 序列化成数据库、文件、IPC……效率不高。

当然我可以进行大的重新设计(fork、IPC、socket...),但这不是问题。

谢谢!

【问题讨论】:

  • 将 glob 用作对象的基础的唯一原因是如果是文件句柄(即使也是一个对象),并且即使您可以序列化也最终无法通过!跨度>
  • 通常情况下,您会在每个线程中接受请求。
  • 告诉我们这个代表http服务器的对象是什么?它是使用 cpan 代码(如果是,是什么),还是私有的东西(如果是,至少显示其中的一部分)?
  • @chris01 在 Perl 中,线程不是更轻量级的。 Perl 的线程或多或少模拟了用户空间中的 fork(),这意味着它们不能像真正的 fork() 那样通过写时复制来共享内存。每个线程都运行自己的 Perl 解释器的完整副本。从历史上看,这个线程实现源于 Windows 的 fork() 模拟。 Perl 线程优于 fork 的唯一优势是在线程之间共享数据通常更简单。你发现了一个分享并不简单的案例。
  • 来自threads docs:“Perl 提供的“基于解释器的线程”并不是人们期望或希望的用于多任务处理的快速、轻量级系统。线程的实现方式使其易于误用。很少有人知道如何正确使用它们或能够提供帮助。官方不鼓励在 perl 中使用基于解释器的线程。”

标签: multithreading perl


【解决方案1】:

好吧,如果没有一些示例代码,很难更具体。

但是将东西交给工人的标准方式是使用Thread::Queue

如果它只是一个文件描述符,你可以enqueue它。如果它有点复杂(例如对象或哈希),您可以使用Storablefreeze/thaw。您可能正在查看它,因为您似乎在谈论一个对象。

但我不会太担心您的效率问题 - 它可能没有您想象的那么重要。您是否正在分析您的代码以确定?

【讨论】:

  • Thread::Queue 无法使用 GLOB - 与 shared_clone 相同的限制。如果工作任务很短,序列化似乎效率不高。
猜你喜欢
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多