python pool.apply_async用队列传返回值 没有结果
时间: 2024-03-21 19:39:48 浏览: 104
在使用 `multiprocessing.Pool()` 中的 `apply_async()` 方法时,需要注意一些细节,否则可能会出现没有结果的情况。
首先,需要创建一个队列,并将其作为参数传递给任务函数。每个任务函数在执行完毕后,将计算结果放入队列中。在主进程中,需要等待所有任务执行完成后,从队列中获取结果并输出。
其次,需要关闭进程池并调用 `join()` 方法等待所有进程完成任务,否则可能会出现进程未完成的情况。
最后,需要确保任务函数的返回值是可序列化的,否则无法将其放入队列中传递。
下面是一个示例代码,可以用于在多进程中使用队列传递任务结果:
```python
import multiprocessing
def worker(num, q):
"""子进程要执行的任务"""
result = num * 2
q.put(result) # 将结果放入队列中
if __name__ == '__main__':
# 创建队列和进程池
q = multiprocessing.Queue()
pool = multiprocessing.Pool()
# 提交任务到进程池中
results = []
for i in range(5):
pool.apply_async(worker, args=(i, q))
# 关闭进程池
pool.close()
# 等待所有进程完成任务
pool.join()
# 从队列中获取结果
while not q.empty():
results.append(q.get())
# 输出结果
print(results)
```
在这个示例中,首先创建了一个队列 `q` 和一个进程池 `pool`。然后,使用 `apply_async()` 方法向进程池提交任务,每个任务都会调用 `worker()` 函数,将计算结果放入队列中。在提交完所有任务后,关闭进程池并等待所有进程完成任务。最后,从队列中获取结果并输出。
如果还是出现没有结果的情况,可以尝试在主进程中休眠一段时间,等待所有子进程都将结果放入队列中。可以使用 `time.sleep()` 方法实现等待。
阅读全文