如何在龙卷风中,在某个进程之间使用`yield queue.get()`这样的队列?

时间:2018-02-06 06:14:36

标签: python multithreading asynchronous queue tornado

我正在编写一个项目。

我尝试如下所示:

  • 通过python multiprocessing启动两个进程,其中一个是龙卷风项目,需要异步。

  • 这两个过程就像任务发送者和任务工作者一样。

所以我使用Queue尝试成为两个进程之间的队列,也就是说,它会起作用,但是应该如下所示

data = queue_a.get()

这不是异步的,我想在下面做(我没有找到实现的方法):

data = yield queue_a.get()

现在,我喜欢下面的内容,使其更加异步,但还不够好:

while True:
    if queue_a.empty():
       yield
    else:
       data = queue_a.get()
raise gen.Return(data)

有人可以告诉我如何让它异步吗?非常感谢

1 个答案:

答案 0 :(得分:2)

这是一个典型的生产者 - 消费者问题,具有无限制的缓冲区。如下图案就足够了。

import multiprocessing as mp


def _task_sender(queue):
    print('task_sender started')
    for data in range(1, 5):
        print('task_sender created data {}'.format(data))
        queue.put(data)
    queue.put(None)
    print('task_sender finished')

def _task_worker(queue):
    print('task_worker started')
    while True:
        data = queue.get()
        if not data:
            break
        print('task_sender got data {}'.format(data))
    print('task_worker finished')


pool = mp.Pool(2)
manager = mp.Manager()
queue = manager.Queue()

task_sender = pool.apply_async(_task_sender, (queue,))
task_worker = pool.apply_async(_task_worker, (queue,))

task_sender.get()
task_worker.get()

样本输出

请注意,由于并发性,输出排序是非确定性的。

task_sender started
task_sender created data 1
task_worker started
task_sender created data 2
task_sender created data 3
task_sender created data 4
task_sender got data 1
task_sender finished
task_sender got data 2
task_sender got data 3
task_sender got data 4
task_worker finished

其他信息

  • .get()可能会抛出异常
  • .get()未链接非常重要 - 如果您这样做,task_worker将在task_sender完成后才会开始
  • 如果您的数据有零或无,请定义其他一些标记值
  • 您可以使用对象而不是函数 - 有两种方法:
    • 实施__init__
    • 实施__call__
  • 建议使用日志记录模块,并且应将其配置为为每个线程显示某种标识符