python多进程用pyinstaller打包碰到的小坑 multiprocessing.Manager().dict()的坑
import multiprocessing
if __name__=='__main__':
p1=multiprocessing.Process(target=jincheng2,args=(q_dict,),daemon=True)
p1.start()
这样写在python环境运行没问题。但用pyinstaller打包成exe文件后就会无限打开新窗口。改成下面这样即可
import multiprocessing
if __name__=='__main__':
multiprocessing.freeze_support()
p1=multiprocessing.Process(target=jincheng2,args=(q_dict,),daemon=True)
p1.start()
还有使用multiprocessing.Manager().dict()的问题,原代码这样写
def jincheng(qq):
h=10
while 1:
qq['x']=h
print(f'进程内{qq}')
h+=1
time.sleep(4)
def zhu():
while 1:
print(f'主进程{q_dict}')
time.sleep(5)
if __name__=='__main__':
multiprocessing.freeze_support()
q_dict = multiprocessing.Manager().dict()
q_dict={'x':'y'}
p1=multiprocessing.Process(target=jincheng,args=(q_dict,),daemon=True)
p1.start()
zhu()
运行结果是这样的
进程内修改根本就没起作用,后来发现改成下面这种写法就可以了,不知道啥原理,只知道这样可行
def jincheng(qq):
h=10
while 1:
qq['x']=h
print(f'进程内{qq}')
h+=1
time.sleep(4)
def zhu():
while 1:
print(f'主进程{q_dict}')
time.sleep(5)
if __name__=='__main__':
multiprocessing.freeze_support()
q_dict = multiprocessing.Manager().dict()
q_dict['x']='y'#就是这里做了修改,改成这样就可以在其他地方任意修改都能做到多进程同步
p1=multiprocessing.Process(target=jincheng,args=(q_dict,),daemon=True)
p1.start()
zhu()
运行结果是:
再强调下这句
multiprocessing.freeze_support()
要是用pyinstaller打包成exe,,这句话一定要写在所有使用multiprocessing之前,我以前的代码是这样的
if __name__=='__main__':
q_dict = multiprocessing.Manager().dict()
q_dict['x']='y'
multiprocessing.freeze_support()
p1=multiprocessing.Process(target=jincheng,args=(q_dict,),daemon=True)
p1.start()
zhu()
结果打包后,无法正常打开程序。。后来把这句话提到定义q_dict之前,程序打包一切正常。。。。怕以后忘了,做个记录