Python 扭曲呼叫遥控器
我必须打远程电话,这可能需要相当长的时间(超过60秒)。我们的整个代码都依赖于处理callRemote的返回值,因此这非常糟糕,因为尽管使用twqisted+50个工作线程运行,但我们一直在阻塞IO 我们目前使用的是Python 扭曲呼叫遥控器,python,multithreading,asynchronous,twisted,Python,Multithreading,Asynchronous,Twisted,我必须打远程电话,这可能需要相当长的时间(超过60秒)。我们的整个代码都依赖于处理callRemote的返回值,因此这非常糟糕,因为尽管使用twqisted+50个工作线程运行,但我们一直在阻塞IO 我们目前使用的是 result = threads.blockingCallFromThread(reactor, callRemote, "method", args) 并获取结果/继续,但正如其名称所示,它正在阻止事件循环,因此我们不能同时等待多个结果 我无法重构整个代码以使其异步,因此我认为
result = threads.blockingCallFromThread(reactor, callRemote, "method", args)
并获取结果/继续,但正如其名称所示,它正在阻止事件循环,因此我们不能同时等待多个结果
我无法重构整个代码以使其异步,因此我认为唯一的方法是将长IO任务延迟到线程
我试图在线程中进行远程调用,但是我找不到一种方法从阻塞调用返回结果。远程调用已经完成,结果在某个地方,但我就是找不到一个钩子
我现在要做的事情看起来像
reactor.callInThread(callRemote, name, *args, **kw)
返回一个空的延迟(为什么?)
我试图将结果放入某种队列中,但它就是不起作用。我该怎么做?好了,
阻塞callfromthread
在reactor
的线程中执行代码。这就是为什么它不能像你需要的那样工作
如果我理解正确,您需要将一些操作移出reactor
s线程,并将结果放入reactor
s线程
对于相同的情况,我使用deferToThread
方法。
延期的例子:
import time
from twisted.internet import reactor, threads
def doLongCalculation():
time.sleep(1)
return 3
def printResult(x):
print x
# run method in thread and get result as defer.Deferred
d = threads.deferToThread(doLongCalculation)
d.addCallback(printResult)
reactor.run()
另外,您可能对threads.deferToThreadPool
感兴趣
谢谢你的回答,但事实上我已经尝试过这个方法和其他一些方法,我得到了延迟返回(即打印),而不是执行blockingCallFromThread时得到的结果。有什么想法吗?我猜这与嵌套延迟有关,但我找不到强制内部延迟启动的方法。此外,我尝试了reactor.callInThread,但也不起作用,我想知道reactor.callInThread和threads.deletothread之间的区别是什么?关于嵌套延迟,我的建议是尽可能使用
@defer.inlineCallback
重构代码。我刚刚查看了blockingCallFromThread
的源代码。代码使用Queue.Queue
存储回调和errback的结果。我的第二个建议是:尝试模仿blockingCallFromThread
并使用Queue
进行处理,但使用callInThread
将计算移动到单独的线程。注意,reactor.callInThread
和threads.deferToThread
之间的主要区别在于,最后一个线程返回的结果是“开箱即用”。顺便说一句,threads.deferToThread
使用reactor.callFromThread
。好吧,我不知怎么搞到了。确实存在嵌套回调;如果我选择res=threads.deferToThread(callRemote,method,*args,**kw)
,它将res作为延迟返回。一段时间后(最多60秒),延迟触发,我可以在res.result.result中得到它的结果。我不知道如何以非阻塞的方式等待结果。我在一个单独的线程中启动了某种“poll”过程,它每x秒检查一次延迟是否已触发,但由于某种原因,应用程序在等待过程中被阻塞。