Python中线程之间的信号传递

时间:2012-05-15 15:05:41

标签: python multithreading celery

我正在研究实时数据采集器。我有一段时间的True循环,在其中,我产生了执行相对较小任务的线程(我通过HTTP查询第三方API,并实现我并行查询的快速速度)。

每个线程都负责更新特定的数据系列。这可能需要2秒,3秒甚至5秒。但是,我的True循环可能会比线程完成所花费的时间更快地生成线程。因此,我需要生成的线程等待其先前的线程完成。

一般情况下,由于线程查询HTTP服务器,线程完成所需的时间不可预测...

我正在考虑为每个线程创建一个命名信号量,然后如果为特定系列生成的线程发现前一个线程处理同一个系列,它将等待。

我能看到的唯一问题是可能积压的线程......

这里最好的解决方案是什么?我应该看看像芹菜这样的东西吗?我目前正在使用线程模块。

谢谢!

3 个答案:

答案 0 :(得分:2)

NO!请为了你的上帝或聪明的设计师的爱,不要那样做!不要不断创建/生成/任何线程并尝试微观管理它们。 Threadpool - 在启动时创建一些线程,并将它们传递给生产者 - 消费者队列,以等待表示这些HTTP任务的类实例。

答案 1 :(得分:2)

您应该使用Queue.Queue。为每个系列创建一个队列,以及一个侦听该队列的线程。每次需要读取一个系列时,请将一个请求放入队列中。线程等待队列中的项目,以及它接收的每个项目,它都会读取数据。

答案 2 :(得分:0)

如果您在每次查询返回时只是重新查询API,则可以使用的另一个选项是Twisted(Their tutorial on Threading)这样的异步框架。我是一个相对扭曲的初学者,所以可能有更好的方法扭曲扭曲到你的任务比这个 -

from twisted.internet import reactor, defer
def simple_task():
    status = query_your_api()
    return status

def repeating_call(status):
    print(status)
    d = threads.deferToThread(simple_task)
    d.addCallback(repeating_call)

data_series = [data1, data2, data3]
for data in data_series:
    repeating_call('starting everything up')

reactor.run()