1. 参数传入只有一个的时候要加逗号,python才能视为元组
import multiprocessing as mp
def test(a):
print(f"子进程{a}")
return a
def main():
pool = mp.Pool(processes=4)
for i in range(3):
pool.apply_async(test, (i))
pool.close()
pool.join()
print("父进程结束")
if __name__=="__main__":
main()
# 运行结果:
# 父进程结束
解决:参数传入(i) 改为(i,),要求传入元组
import multiprocessing as mp
def test(a):
print(f"子进程{a}")
return a
def main():
pool = mp.Pool(processes=4)
for i in range(3):
pool.apply_async(test, (i, ))
pool.close()
pool.join()
print("父进程结束")
if __name__=="__main__":
main()
# 运行结果:
# 子进程0
# 子进程1
# 子进程2
# 父进程结束
2. 传入复杂对象
import multiprocessing as mp
from boto3.session import Session
class Obj():
def __init__(self,name) -> None:
self.name = name
self.session = Session(aws_access_key_id="access_key",
aws_secret_access_key="secret_key")
def test(a, obj):
print(f"子进程{a}")
print(obj.name)
return a
def main():
obj = Obj("name")
pool = mp.Pool(processes=4)
for i in range(3):
pool.apply_async(test, (i, obj))
pool.close()
pool.join()
print("父进程结束")
if __name__=="__main__":
main()
# 运行结果:
# 父进程结束
解决:内部使用pickle无法序列化复杂对象
1. 重改代码,避免使用复杂对象
2. 使用multiprocessing.Manager,但也只能共享简单数据结构
3. 使用dill库代替pickle库,自定义序列化和反序列化
3. 进程没有报错,如何确定问题
解决:使用参数error_callback打印报错信息
import multiprocessing as mp
from boto3.session import Session
class Obj():
def __init__(self,name) -> None:
self.name = name
self.session = Session(aws_access_key_id="access_key",
aws_secret_access_key="secret_key")
def print_err(value):
print(f"err:{value}")
def test(a, obj):
print(f"子进程{a}")
print(obj.name)
return a
def main():
obj = Obj("name")
pool = mp.Pool(processes=4)
for i in range(3):
pool.apply_async(test, (i, obj),error_callback=print_err)
pool.close()
pool.join()
print("父进程结束")
if __name__=="__main__":
main()
# 运行结果:
# err:Can't pickle local object 'lazy_call.<locals>._handler'
# err:Can't pickle local object 'lazy_call.<locals>._handler'
# err:Can't pickle local object 'lazy_call.<locals>._handler'
# 父进程结束