TLDR:我正在为应用程序开发人员寻找asyncio的全面或权威解释(教程/书籍/演示文稿/ ...).
虽然我对事件循环和期货/延迟/承诺有很好的理解(很大程度上要归功于JavaScript),但是Python的asyncio的复杂性仍然让我感到困惑.asyncio似乎比我习惯的要复杂得多 - 可能是因为它部分设计用于与现有实现(Twisted,Tornado等)的低级兼容性,并且因为它允许在单独的线程中进行多个事件循环.
据我所知,基本概念没有全面的演练,因此我在网上查阅了官方文档以及各种文章和演示文稿.
然而,我仍然不确定我的理解,很可能是因为并不总是清楚应用程序级别的相关内容,或者您是否不需要担心上述替代方案.(许多资源似乎都认为熟悉Twisted等人.)
一些导致我不确定的事情的例子:
asyncio.coroutine结合使用yield from,但这种比较表明我应该重新考虑.loop.create_server(MyProtocol)或创建服务器asyncio.start_server(my_connection_handler)- 何时使用?loop.close()之后loop.run_forever())的适当卫生是什么?Task除了Futures 之外还需要s.yield from,看似无效)怎么办?@property和asyncio.coroutine)吗?StreamWriter.write是非阻塞的,但我不知道是否真的如此.我不是要求这些特定问题的答案,它们只是说明了我在概念层面上的挣扎.
关于"除了代码之外的所有内容并行运行"的问题,来自Node.js的新人.这是一个明显人为的例子,但是我想说我想创建一个包含函数的数学库,factorize()其行为如下:
var http = require('http');
http.createServer(function (req, res) {
myMath.factorize(some_big_number,function(factors) {
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify(factors));
}
}).listen(8000);
Run Code Online (Sandbox Code Playgroud)
如何编写它以便"并行运行"?
我一直在查看这个库中的解析代码作为一个可能需要一些处理时间的例子.代码的主体被认为是"你的代码",还是"并行运行"?
如果不是:在编写时我需要做什么,factorize()以便它也是非阻塞/表现得像客户端?使用EventEmitter是否足够?
如果不清楚,请提前道歉.
有没有办法fork()在Perl中实现非阻塞/异步执行(没有'ing)?
我曾经是一名Python开发人员多年...... Python拥有非常棒的'Twisted'框架允许这样做(使用DEFERREDs.当我运行搜索以查看Perl中是否有任何内容可以执行相同操作时,我遇到了POE框架 - 看起来与我正在搜索的内容"相近".但是......花了一些时间阅读文档并"玩"代码后,我反对"墙" - 这是限制性的(来自POE) ::会话文档):
回调不是先发制人的.只要一个人正在运行,就不会派遣其他人.这称为协作式多任务处理.每个会话必须通过返回中央调度内核进行协作.
这种限制基本上违背了异步/并行/非阻塞执行的目的 - 通过限制在任何给定时刻执行的只有一个回调(代码块).当另一个回调已经在运行时,没有其他回调可以开始运行!
所以......在Perl中有没有办法实现多任务(并行,非阻塞,异步执行代码)而不用fork()- 类似于Python中的DEFERREDs?
我正在使用twsited的INotify监视/ dev目录以监视正在添加的新串行设备.我目前使用的代码类似于下面的代码.
notifier = INotify()
notifier.watch(FilePath("/dev"), IN_CREATE, callbacks=[self.created])
notifier.startReading()
def created(self, ignored, path, mask):
...
blocking code
...
Run Code Online (Sandbox Code Playgroud)
我现在遇到的问题是当'created'被调用时,它阻塞了我的反应器,所以其他网络会话(我有同一个反应器的TCP和UDP连接)必须等待'created'方法完.
有谁知道如何让"创建"方法在后台运行,所以它不会阻止我的反应堆?
谢谢,
西蒙
python ×2
asynchronous ×1
blocking ×1
events ×1
inotify ×1
javascript ×1
node.js ×1
nonblocking ×1
perl ×1
twisted ×1