【发布时间】: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 的唯一优势是在线程之间共享数据通常更简单。你发现了一个分享并不简单的案例。
-
来自
threadsdocs:“Perl 提供的“基于解释器的线程”并不是人们期望或希望的用于多任务处理的快速、轻量级系统。线程的实现方式使其易于误用。很少有人知道如何正确使用它们或能够提供帮助。官方不鼓励在 perl 中使用基于解释器的线程。”
标签: multithreading perl