0

我需要同时调用两个不同的方法以节省时间并使用从这些方法获得的结果我需要调用另一个方法,所以我遇到了 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()

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

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

4

1 回答 1

0

deferToThread不创建新线程。它从反应器的线程池中获取一个线程。该线程池的大小有一个上限。一旦所有线程都被您的一个方法占用,下一个deferToThread调用将无法启动您传递它的方法,直到池中的一个线程完成并变得可用。

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

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

于 2014-03-05T12:07:24.813 回答