0

我正在开发一个实时数据采集器。我有一个 while True 循环,在其中,我生成了执行相对较小任务的线程(我正在通过 HTTP 查询第 3 方 API,为了实现快速并行查询)。

每个线程都负责更新特定的数据系列。这可能需要 2、3 甚至 5 秒。但是,我的 while True 循环产生线程的速度可能比线程完成所需的时间要快。因此,我需要生成的线程等待它们之前的线程完成。

一般来说,由于线程查询 HTTP 服务器,线程完成需要多长时间是不可预测的......

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

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

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

谢谢!

4

3 回答 3

2

不!拜托,看在你的上帝或聪明的设计师的份上,不要那样做!不要不断地创建/产生/任何线程并尝试对它们进行微观管理。线程池 - 在启动时创建一些线程并将它们传递给生产者-消费者队列以等待代表这些 HTTP 任务的类实例。

于 2012-05-15T15:26:45.173 回答
2

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

于 2012-05-15T15:26:58.180 回答
0

如果您只是在每次查询返回时重新查询 API,则可以使用的另一个选项是一个异步框架,例如 Twisted(他们关于线程的教程)。我是一个相对的 Twisted 初学者,所以可能有比这更好的方法来扭曲 Twisted 来完成你的任务 -

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()
于 2012-05-15T16:40:25.573 回答