我正在编写一个项目。
我尝试如下所示:
通过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)
有人可以告诉我如何让它异步吗?非常感谢
答案 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__