【问题标题】:python tornado queue toro task consuming in parallel [closed]python龙卷风队列toro任务并行消耗[关闭]
【发布时间】:2016-05-06 09:21:22
【问题描述】:

谁能好心告诉我如何并行运行长时间运行的任务?这是我的解决方案,采用顺序解决方案:

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

【问题讨论】:

  • 你有什么问题?您提出的要点是否有问题需要帮助?

标签: python asynchronous parallel-processing queue tornado


【解决方案1】:

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

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,最大队列大小会限制生产者。

【讨论】:

  • 真的很有帮助。我确实改编了要点,请看一下:gist.github.com/dzizes/4c23ba4c2cd7bfbeff643c0cb85749c7我不确定在哪里设置 self.running 正确。 producer/load_work() 应该不断工作 - 工作(插入到 db)来自另一个应用程序:现在看起来生产者生产所有工作(7),消费者消费工作(7)等等
  • 在应用程序启动时设置 self.running = True,并在应用程序退出时设置 self.running = False。
  • 但我没有结束申请。它像一个恶魔一样工作。当我在没有睡眠的情况下运行它时,它会消耗完整的 CPU。
  • 我真正需要的是一个守护进程,它将消耗数据库中的作业,然后并行处理(非并发)。 Tornado 可以实现它吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
相关资源
最近更新 更多