2013-01-16 28 views

回答

1

因为无法预测他们是否会对数据库,远程进程,Web服务等执行任何I/O操作,所以您可能会考虑在插件将被调用的地方“推迟”。

使用@inlineCallbacks进行研究,这将简化您的生活,只需使用Python的yield语句将处理分解为延迟。然后,您可以尝试以各种方式分解计算密集型工作,也许可以为其他协议处理程序提供运行和完成的机会,特别是如果某些处理程序是计算密集型的而其他处理程序不是。

+0

我正在考虑拆分插件调用,但我想知道限制或推荐的方式进行拆分。 –

+0

如果您将代码转换为使用@inlineCallbacks装饰器,则可以将可能类似于'results = plugin.method(arg1,arg2)'的插件调用转换为'results = yield plugin.method(arg1,arg2)'这将有效地在插件调用中分割你的处理。这是inlineCallbacks的'内联'方面,它确实有助于将你的Twisted代码整理好。 – PaulMcG

+0

这个答案并不是真的正确。如果你用'yield'语句分解一个函数,它不一定会变成异步的,除非被生成的东西是一个'Deferred';即使如此,在被取消时,“延迟”必须是*未被解除的;为了产生任何效果,你必须“产生延迟(...)”。更好的是'twisted.internet.task.cooperate'。 – Glyph