python龙卷风队列toro任务并行消耗

时间:2016-05-06 09:21:22

标签: python asynchronous parallel-processing queue tornado

任何人都可以这么善良,让我知道如何并行运行长时间运行的任务?这是我的解决方案,顺序解决方案:

https://gist.github.com/dzizes/4c23ba4c2cd7bfbeff643c0cb85749c7

1 个答案:

答案 0 :(得分:0)

您需要启动多个工作人员。这行开始了一个工人协程:

io_loop.run_sync(mongoQueue.worker)

相反,做一些事情:

@gen.coroutine
def workers(self):
    futures = [self.worker() for _ in range(CONCURRENT)]
    yield futures            

然后:

io_loop.run_sync(mongoQueue.workers)

我将把队列填满工作岗位的工作转移到生产者身上而不是生产者:

@gen.coroutine
def producer(self):
    while self.running:
        yield self.load_work()

这更像the standard consumer-producer code in the Tornado docs。然后,更新workers,以便生成一个生产者:

@gen.coroutine
def workers(self):
    IOLoop.current().spawn_callback(self.producer)
    futures = [self.worker() for _ in range(CONCURRENT)]
    yield futures       

the docs for why we use spawn_callback to spawn a coroutine。你需要在开始时设置self.running True,并通过设置self.running False来决定何时结束你的制作人。您还需要决定如何结束工作程序协程。

对您的代码进行其他一些更正。首先,不要通过使用值_thread命名协程来使自己感到困惑:您的代码是单线程的,它使用协同程序实现并发。其次,您不需要gen.sleep,最大队列大小将限制生产者。