Python Twisted 多线程

3

你好,您能告诉我如何使用Twisted的线程池在不同线程中使用不同函数吗?

我有一个ID列表x=[1,2,3,4],其中1、2等都是ID(我从数据库中获取的),每个ID都包含Python脚本。

我的需求是:

遍历列表x并在不同线程中运行每个脚本直到它们完成。


感谢Calderone的代码,帮助我很多。

我有一些疑问,例如我可以通过这种方式调整线程池的大小。

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

假设所有30个可用线程都在忙碌中,但列表(字典或元组)中仍有一些id需要处理。 1-在这种情况下,所有id都会被遍历吗?也就是说,一旦线程空闲,下一个工具(id)就会分配给空闲的线程吗? 2-有些情况下,必须先执行一个工具,然后再执行第二个工具,并且一个工具的输出将被另一个工具使用,在Twisted线程中如何管理这种情况。 3

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的线程教程中了解有关线程的更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接