任何人都可以这么善良,让我知道如何并行运行长时间运行的任务?这是我的解决方案,顺序解决方案:
https://gist.github.com/dzizes/4c23ba4c2cd7bfbeff643c0cb85749c7
答案 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
,最大队列大小将限制生产者。