Perl中的非阻塞/异步执行

Val*_*Val 13 parallel-processing perl asynchronous nonblocking

有没有办法fork()在Perl中实现非阻塞/异步执行(没有'ing)?

我曾经是一名Python开发人员多年...... Python拥有非常棒的'Twisted'框架允许这样做(使用DEFERREDs.当我运行搜索以查看Perl中是否有任何内容可以执行相同操作时,我遇到了POE框架 - 看起来与我正在搜索的内容"相近".但是......花了一些时间阅读文档并"玩"代码后,我反对"墙" - 这是限制性的(来自POE) ::会话文档):

回调不是先发制人的.只要一个人正在运行,就不会派遣其他人.这称为协作式多任务处理.每个会话必须通过返回中央调度内核进行协作.

这种限制基本上违背了异步/并行/非阻塞执行的目的 - 通过限制在任何给定时刻执行的只有一个回调(代码块).当另一个回调已经在运行时,没有其他回调可以开始运行!

所以......在Perl中有没有办法实现多任务(并行,非阻塞,异步执行代码)而不用fork()- 类似于Python中的DEFERREDs

Ale*_*nii 11

Coro是POE和线程之间的混合体.从阅读它的CPAN文档,我认为IO :: Async可以实现真正的异步执行.线程也可以使用 - 至少Padre IDE成功使用它们.

  • Coro也是合作多任务处理. (3认同)
  • @dlamblin,不一定,但Val似乎认为是这种情况. (2认同)

jig*_*ggy 8

我对Twisted或POE不是很熟悉,但基本的并行执行对于线程来说非常简单.解释器通常不会使用线程支持进行编译,因此您需要检查它.所述包是一个简易替换为螺纹(实现了全部的API),但使用过程的无缝连接.然后你可以做这样的事情:

my $thread = async {
    print "you can pass a block of code as an arg unlike Python :p";
    return some_func();
};
my $result = $thread->join();
Run Code Online (Sandbox Code Playgroud)

我肯定使用forks在异步进程中实现了一个事件循环的回调,我不明白为什么它不能用于线程.


dla*_*lin 1

我相信你用的select就是这种东西。与分叉更相似的是,还有线程