Perl线程:在线程之间共享GLOB

3

我正在尝试使用Perl创建一个并行处理的Web服务器。

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

在接受连接后,我再次为客户端连接获取一个GLOB。

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

我可以动态创建线程并通过参数将其传递给它们。但是创建线程对性能不利,因此我希望有一个固定的等待工作者池。

那么如何以一种优雅的方式将GLOB传递给已经运行的线程?序列化到DB、文件、IPC等都不高效。

当然,我可以进行大型重构(fork、IPC、套接字等),但这不是问题的关键。

谢谢!


1
唯一使用全局变量作为对象基础的原因是它是一个文件句柄(即使也是一个对象),即使您愿意进行序列化,最终也无法传递! - ikegami
1
通常情况下,您需要在每个线程中接受请求。 - ikegami
1
告诉我们代表HTTP服务器的对象是什么?它使用CPAN代码吗(如果是,是哪些),还是私有的东西(如果是,至少展示一些)? - ysth
1
@chris01 在Perl中,线程并不更轻量级。Perl的线程或多或少模拟了用户空间中的fork(),这意味着它们不能像真正的fork()那样通过写时复制来共享内存。每个线程都运行其自己的完整副本Perl解释器。历史上,这种线程实现是从Windows的fork()模拟中发展而来的。Perl线程唯一的优点是通常更容易在线程之间共享数据。您已经找到了一个共享不简单的情况。 - amon
1
threads文档中可以看出:“Perl提供的“基于解释器的线程”并不是人们期望或希望的快速轻量级多任务处理系统。线程的实现方式使它们容易被误用。很少有人知道如何正确使用它们或能够提供帮助。在perl中使用基于解释器的线程是官方不鼓励的。” - amon
显示剩余4条评论
1个回答

0

没有一些示例代码很难更具体地说明。

但是将任务交给工作线程的标准方法是使用Thread::Queue

如果只是一个文件描述符,您可以使用enqueue。如果它更复杂一些(例如对象或哈希),则可以使用Storablefreeze/thaw。您可能正在考虑这个问题,因为您似乎在谈论一个对象。

但我不会过于担心您的效率问题-它可能并不像您想象的那样重要。您是否对代码进行了分析以确保呢?


Thread::Queue 无法与 GLOB 一起使用 - 具有 shared_clone 相同的限制。如果工作任务非常短,则序列化似乎不是有效的选择。 - chris01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接