Python Twisted 线程

3 投票
1 回答
4854 浏览
提问于 2025-04-16 01:16

你好,你能告诉我怎么在Twisted中使用线程池来在不同的线程中运行不同的函数吗?

我有一个ID列表 x=[1,2,3,4],这些ID(1, 2,等等)是我从数据库里拿到的,每个ID对应的地方都有一个Python脚本。

我想做的是:

遍历这个列表x,扫描每个ID,并在不同的线程中运行每个脚本,直到它们都完成。


谢谢你,Calderone,你的代码帮了我很多。

我有几个疑问,比如我可以通过这种方式调整线程池的大小。

from twisted.internet import reactor
reactor.suggestThreadPoolSize(30)

假设所有30个可用的线程都在忙,还有一些ID在列表中(字典或元组)。

1- 在这种情况下,所有的ID都会被遍历吗?我的意思是,一旦有线程空闲,接下来会把下一个工具(ID)分配给这个空闲的线程吗?

2- 还有一些情况是,一个工具必须在第二个工具之前执行,并且一个工具的输出会被另一个工具使用,这在Twisted的线程中是怎么管理的?

1 个回答

14

在Twisted中,线程主要是通过 twisted.internet.threads.deferToThread 来使用的。还有一个新的接口,稍微灵活一点,叫做 twisted.internet.threads.deferToThreadPool。不过,不管用哪个,基本上做的事情是差不多的。你只需要遍历你的数据,然后用其中一个函数把它发送到一个线程去处理。你会得到一个 Deferred,它会告诉你结果是什么,以及什么时候可以获取到这个结果。

from twisted.internet.threads import deferToThread
from twisted.internet.defer import gatherResults
from twisted.internet import reactor

def double(n):
    return n * 2

data = [1, 2, 3, 4]

results = []
for datum in data:
    results.append(deferToThread(double, datum))

d = gatherResults(results)
def displayResults(results):
    print 'Doubled data:', results
d.addCallback(displayResults)
d.addCallback(lambda ignored: reactor.stop())

reactor.run()

想了解更多关于Twisted中线程的内容,可以查看 线程使用指南

撰写回答