1
在Twisted中实现一个客户端协议,我当前的代码在接收到的每个协议单元上都做了很多工作,它不使用I/O,所以目前没有使用Deferreds。 处理并不意味着密集,但它对可插入接口开放。当你应该将协议处理代码分成Twisted中的Deferreds?
是否有阈值来做这个分区?
在Twisted中实现一个客户端协议,我当前的代码在接收到的每个协议单元上都做了很多工作,它不使用I/O,所以目前没有使用Deferreds。 处理并不意味着密集,但它对可插入接口开放。当你应该将协议处理代码分成Twisted中的Deferreds?
是否有阈值来做这个分区?
因为无法预测他们是否会对数据库,远程进程,Web服务等执行任何I/O操作,所以您可能会考虑在插件将被调用的地方“推迟”。
使用@inlineCallbacks
进行研究,这将简化您的生活,只需使用Python的yield
语句将处理分解为延迟。然后,您可以尝试以各种方式分解计算密集型工作,也许可以为其他协议处理程序提供运行和完成的机会,特别是如果某些处理程序是计算密集型的而其他处理程序不是。
我正在考虑拆分插件调用,但我想知道限制或推荐的方式进行拆分。 –
如果您将代码转换为使用@inlineCallbacks装饰器,则可以将可能类似于'results = plugin.method(arg1,arg2)'的插件调用转换为'results = yield plugin.method(arg1,arg2)'这将有效地在插件调用中分割你的处理。这是inlineCallbacks的'内联'方面,它确实有助于将你的Twisted代码整理好。 – PaulMcG
这个答案并不是真的正确。如果你用'yield'语句分解一个函数,它不一定会变成异步的,除非被生成的东西是一个'Deferred';即使如此,在被取消时,“延迟”必须是*未被解除的;为了产生任何效果,你必须“产生延迟(...)”。更好的是'twisted.internet.task.cooperate'。 – Glyph