多次调用threads.deferToThread

时间:2014-03-05 06:41:00

标签: python-2.7 twisted twisted.internet

我需要同时调用两种不同的方法以节省时间并使用从我需要调用另一种方法的那些方法获得的结果,所以我遇到了twisted.internet.threads中的deferToThread方法,它返回一个延迟对象,以便我可以附加回调方法。

这是我的代码

for key,val in result.items():
    d=threads.deferToThread(myMethod1,key,val)
    d1=threads.deferToThread(myMethod2,key)
    d.addCallback(myMethod3)
    d1.addCallback(myMethod4)

reactor.run()

在给定的代码中,result是一个字典。 myMethod1和myMethod2,这些是我需要异步运行的两个方法。

根据我的理解,deferToThread将创建一个单独的线程来为字典中的每个项执行给定的方法,因此每次循环迭代时,它将创建两个不同的线程。没关系。但我需要在修复间隔后连续运行此代码。我尝试在修复间隔后运行它但在执行了16到17次之后,每件事都停止工作。这是否意味着许多线程在后台运行?如果有很多线程正在运行那么如何停止或如何杀死这些线程?

1 个答案:

答案 0 :(得分:0)

deferToThread不会创建新主题。它需要来自reactor的线程池的一个线程。该线程池的大小有一个上限。一旦所有线程都被您的一个方法占用,下一个deferToThread调用将无法启动您传递的方法,直到池中的一个线程完成并变为可用。

从池中释放线程的方法是让它运行的方法完成(引发异常或返回)。没有其他方法可以释放线程(它们是普通的Python线程; Python线程不支持从外部单向终止)。

您可能想要重新考虑使用线程。 Twisted中有很多API可以帮助您在没有使用线程的情况下异步执行任务。您没有在myMethod1myMethod2中解释您正在做什么,所以我不能建议任何特定的API。