我正在研究实时数据采集器。我有一段时间的True循环,在其中,我产生了执行相对较小任务的线程(我通过HTTP查询第三方API,并实现我并行查询的快速速度)。
每个线程都负责更新特定的数据系列。这可能需要2秒,3秒甚至5秒。但是,我的True循环可能会比线程完成所花费的时间更快地生成线程。因此,我需要生成的线程等待其先前的线程完成。
一般情况下,由于线程查询HTTP服务器,线程完成所需的时间不可预测...
我正在考虑为每个线程创建一个命名信号量,然后如果为特定系列生成的线程发现前一个线程处理同一个系列,它将等待。
我能看到的唯一问题是可能积压的线程......
这里最好的解决方案是什么?我应该看看像芹菜这样的东西吗?我目前正在使用线程模块。
谢谢!
答案 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()