Python 扭曲呼叫遥控器

Python 扭曲呼叫遥控器,python,multithreading,asynchronous,twisted,Python,Multithreading,Asynchronous,Twisted,我必须打远程电话,这可能需要相当长的时间(超过60秒)。我们的整个代码都依赖于处理callRemote的返回值,因此这非常糟糕,因为尽管使用twqisted+50个工作线程运行,但我们一直在阻塞IO 我们目前使用的是 result = threads.blockingCallFromThread(reactor, callRemote, "method", args) 并获取结果/继续,但正如其名称所示,它正在阻止事件循环,因此我们不能同时等待多个结果 我无法重构整个代码以使其异步,因此我认为

我必须打远程电话,这可能需要相当长的时间(超过60秒)。我们的整个代码都依赖于处理callRemote的返回值,因此这非常糟糕,因为尽管使用twqisted+50个工作线程运行,但我们一直在阻塞IO

我们目前使用的是

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秒检查一次延迟是否已触发,但由于某种原因,应用程序在等待过程中被阻塞。