Perl中的非阻塞IO *** 作是否仅限于一个线程?好的设计?

Perl中的非阻塞IO *** 作是否仅限于一个线程?好的设计?,第1张

概述我正在尝试开发一个服务,其中包含许多客户端和服务器套接字(服务器服务以及连接到托管组件并持久化的客户端),这些服务器通过IO :: Select进行同步轮询.我们的想法是处理I / O和/或请求通过工作线程池产生的处理需求. 使数据在Perl(threads :: shared)中的线程之间可共享的共享关键字有其限制 – 句柄引用不属于可共享的基元. 在我发现无法共享句柄和/或句柄引用之前,计划是 我正在尝试开发一个服务,其中包含许多客户端和服务器套接字(服务器服务以及连接到托管组件并持久化的客户端),这些服务器通过IO :: Select进行同步轮询.我们的想法是处理I / O和/或请求通过工作线程池产生的处理需求.

使数据在Perl(threads :: shared)中的线程之间可共享的共享关键字有其限制 – 句柄引用不属于可共享的基元.

在我发现无法共享句柄和/或句柄引用之前,计划是使用一个select()线程来处理轮询,然后将相关句柄放在线程池中的某些ThreadQue中,以实际执行读写. (当然,我正在设计这个,以便对select使用的实际描述符集的修改将是线程安全的,并且仅在一个线程中发生 – 运行select()的相同,因此从不在它运行时,明显.)

这似乎不会发生,因为句柄本身无法共享,因此轮询以及读取和写入都需要从一个线程发生.这有什么解决方法吗?我指的是跨线程的实际系统调用的分解;很明显,有一些方法可以使用队列和缓冲区来在其他线程中生成数据并在其他线程中实际发送.

这种情况产生的一个问题是我必须给select()一个超时,并且期望它足够高,不会导致轮询相当大的描述符集的任何问题,同时足够低,不会引入太多的延迟进入我的计时事件循环 – 虽然,我明白如果在轮询过程中检测到实际的I / O集成员资格,select()将提前返回,这部分缓解了问题.我宁愿有一些方法从另一个线程唤醒select(),但由于句柄无法共享,我不能轻易想到这样做的方法,也看不到这样做的价值;什么是其他线程知道什么时候适当唤醒select()?

如果没有解决方法,Perl中这类服务的优秀设计模式是什么?我需要相当大的可伸缩性和并发I / O,因此出于非阻塞路由而不是仅为每个侦听套接字和/或客户端和/或服务器进程生成线程,因为许多人使用更高的 – 现在,在处理套接字时,这些级别的语言是不习惯的 – 它似乎是Java领域的一种标准做法,似乎没有人关心java.nio.*在面向系统的编程的狭隘领域之外.也许这只是我的印象.无论如何,我不想这样做.

因此,从经验丰富的Perl系统程序员的角度来看,这些东西应该如何组织?单片I / O线程纯工作者(非I / O)线程很多队列?某种聪明的黑客?除了我已经列举的内容之外,任何线程安全都需要注意?有没有更好的办法?我在使用C语言构建此类程序方面拥有丰富的经验,但没有使用Perl习语或运行时特性.

编辑:P.S.我肯定想过,也许具有这些性能要求的程序和这种设计不应该用Perl编写.但我看到Perl中生成了大量非常复杂的服务,所以我不确定.

解决方法 包括几个更大的设计问题,我可以提供一些方法来跨perl线程共享文件句柄.

可以将$clIEnt传递给线程启动例程,或者只是在新线程中引用它:

$clIEnt = $server_socket->accept();threads->new(\&handle_clIEnt,$clIEnt);async { handle_clIEnt($clIEnt) };# $clIEnt will be closed only when all threads' references# to it pass out of scope.

对于Thread :: Queue设计,可以将基础fd入队():

$q->enqueue( POSIX::dup(fileno $clIEnt) );# we dup(2) so that $clIEnt may safely go out of scope,# closing its underlying fd but not the duplicate thereofasync {  my $clIEnt = IO::Handle->new_from_fd( $q->dequeue,"r+" );  handle_clIEnt($clIEnt);};

或者可以只使用fds,以及Perl选择的位向量形式.

总结

以上是内存溢出为你收集整理的Perl中的非阻塞I / O *** 作是否仅限于一个线程?好的设计?全部内容,希望文章能够帮你解决Perl中的非阻塞I / O *** 作是否仅限于一个线程?好的设计?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1253121.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存