python - 在apply async python函数中调用apply async
问题描述
我正在尝试使用 apply_async 函数内部调用一个池,当我尝试将一个函数传递给另一个函数的池时出现序列化对象错误,因此我将第二个池移动到全局但它仍然对我不起作用,我是什么失踪 ?我的代码:
from multiprocessing import Pool
b_pool = Pool(1)
def func_a(i):
global b_pool
print "a : {}".format(i)
try:
res = b_pool.apply_async(func_b, args=(i,))
except Exception as e:
print e
def func_b(i):
print "b : {}".format(i)
file = "/home/ubuntu/b_apply.txt"
f = open(file, "a")
f.write("b : {}".format(i))
f.close()
if __name__ == '__main__':
a_pool = Pool(1)
for i in range(10):
res = a_pool.apply_async(func_a,args=(i,) )
a_pool.close()
a_pool.join()
b_pool.close()
b_pool.join()
在此代码中,只有 a 打印 0 -9 而 b 甚至不打印到文件。我正在使用 python 2.7
解决方案
队列是好的方向,只是 multiprocessing.Queue 不能像这样传递,但 Manager.Queue 是这样做的正确方法,我的代码有效:
from multiprocessing import Pool,Manager
def func_a(i,q):
print "a : {}".format(i)
try:
q.put(i)
except Exception as e:
print e
def func_b(i,q):
i = q.get()
print "b : {}".format(i)
if __name__ == '__main__':
m = Manager()
q = m.Queue()
a_pool = Pool(1)
b_pool = Pool(1)
for i in range(10):
res = a_pool.apply_async(func_a,args=(i,q,) )
res_2 = b_pool.apply_async(func_b, args=(i,q,))
a_pool.close()
a_pool.join()
b_pool.close()
b_pool.join()
这个答案在多个进程之间共享结果队列非常有帮助
推荐阅读
- networking - VMWare,无法通过桥接连接从 Windows 10 主机 ping Linux 来宾
- .net-core - 从 .Net Core 调用框架方法时找不到库
- javascript - 如何使用 Spring Boot、JavaScript、Ajax 将网页的电子邮件作为附件发送?
- c++11 - 是什么导致第一个功能看起来与第二个功能相似的错误?
- date - Apps 脚本:如何将英文日期格式转换为德文日期格式?
- excel - Excel 在发布到 Power BI 时不会覆盖数据集文件
- azure-devops - 使用托管证书 + afdverify 预配 Azure FrontDoor 超时问题
- intellij-idea - 如何自动保存 Intellij IJEA 上下文
- php - 用于照明/路由外部框架的 404
- google-analytics - 在 Google Analytics 中跟踪 Prestashop 的废弃购物车