Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl中的非阻塞/异步执行_Perl_Asynchronous_Parallel Processing_Nonblocking - Fatal编程技术网

Perl中的非阻塞/异步执行

Perl中的非阻塞/异步执行,perl,asynchronous,parallel-processing,nonblocking,Perl,Asynchronous,Parallel Processing,Nonblocking,有没有一种方法可以在Perl中实现非阻塞/异步执行(无需“ing”)呢 我曾经是Python开发人员很多年了。。。Python有一个非常好的“扭曲”框架,允许这样做(使用。当我运行search以查看Perl中是否有任何东西可以这样做时,我遇到了-这似乎与我搜索的内容“非常接近”。但是……在花了一些时间阅读文档和“玩”代码之后,我遇到了“墙”-以下限制(来自文件): 回调不是抢占式的。只要一个正在运行,就不会调度其他回调。这称为协作多任务。每个会话必须通过返回中央调度内核进行协作 这种限制实质上违

有没有一种方法可以在Perl中实现非阻塞/异步执行(无需“ing”)呢

我曾经是Python开发人员很多年了。。。Python有一个非常好的“扭曲”框架,允许这样做(使用。当我运行search以查看Perl中是否有任何东西可以这样做时,我遇到了-这似乎与我搜索的内容“非常接近”。但是……在花了一些时间阅读文档和“玩”代码之后,我遇到了“墙”-以下限制(来自文件):

回调不是抢占式的。只要一个正在运行,就不会调度其他回调。这称为协作多任务。每个会话必须通过返回中央调度内核进行协作

这种限制实质上违背了异步/并行/非阻塞执行的目的——在任何给定时刻只执行一个回调(代码块)。当另一个回调已经运行时,其他回调不能开始运行


那么…在Perl中有没有实现多任务(并行、非阻塞、异步执行代码)的方法没有'ing-类似于Python?

我相信你会使用这种方法。更类似于forking,还有。

我不太熟悉Twisted或POE,但是基本的并行执行非常简单。解释器通常不支持线程,所以你需要检查一下。这个包是一个drop-in替代线程(实现完整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();

我确实使用forks在异步进程中实现了事件循环的回调,但我不明白为什么它不能与线程一起工作。

是POE和线程的混合体。通过阅读其CPAN文档,我认为IO::async确实可以执行异步。也可以使用,至少Padre IDE成功地使用了它们。

PO如果您想要异步处理,E是可以的,但是只使用一个cpu(核心)是可以的。
例如,如果应用程序受I/O限制,那么在大多数情况下,一个进程就足够了。

Twisted也使用协作多任务,就像&

然而,Twisted
Deferred
似乎确实(或可以)利用了threads.NB。从SO问题中可以看出这一点

因此,您需要使用相同的路径(尽管使用)

所以一个解决方案是使用:-可移植地在子进程中运行阻塞代码和程序

寻找可供选择的方案,以查看和

当另一个回调已在运行时,其他回调无法开始运行

据我所知,这与所有语言都是一样的(当然,每个CPU线程;现代web服务器通常每个CPU核心至少产生一个进程或线程,因此(对用户而言)它看起来像是并行工作的东西,但长时间运行的回调没有被中断,其他一些核心只是完成了这项工作)

你不能中断一个中断,除非被中断的中断已经被专门编程以适应它


想象一下运行一分钟的代码,一台16核的PC机——现在想象一下有一百万人尝试加载该页面,你可以向16人发送工作结果,然后“超时”所有其他的,或者,你可以崩溃你的web服务器,不给任何人任何结果。人们选择不崩溃他们的web服务器,这就是为什么他们从不允许回调中断其他回调的原因(即使他们尝试了,他们也不能这样做-在前一个回调结束之前,调用方永远不会获得控制权来进行新的调用…)

Coro也是合作式多任务处理。@ikegami的合作意味着它对Val不起作用,对吗?@dlamblin,不一定,但Val似乎认为是这样。IO::Async是多路IO,与POE和AnyEvent以及Perl上的其他任何东西的方式相同。它们都只是相同基本思想的现代变体,最初是从一个
选择
循环。