在学习python多进程管理manager时候,当不使用join对当前进程(主进程)进行阻塞时会报错,具体代码及错误如下:
from multiprocessing import Process, Manager import time import os def info(title): print(title) print(‘module name:‘, __name__) print(‘parent process:‘, os.getppid()) print(‘process id:‘, os.getpid()) print("\n\n") def f(d, l,n): info(‘\033[32;1m subprocess line\033[0m‘) d[1] = ‘1‘ d[‘2‘] = 2 d[0.25] = None l.append(n) print(l) if __name__ == ‘__main__‘: info(‘\033[32;1mmain process line\033[0m‘) with Manager() as manager: d = manager.dict() l = manager.list(range(5)) p_list = [] for i in range(10): p = Process(target=f, args=(d, l,i)) p_list.append(p) # p.join() for p in p_list: p.start() # time.sleep(1) # time.sleep(1) for res in p_list: res.start() res.join()
报错:
Process Process-11: Traceback (most recent call last): File "/usr/lib/python3.4/multiprocessing/managers.py", line 724, in _callmethod conn = self._tls.connection AttributeError: ‘ForkAwareLocal‘ object has no attribute ‘connection‘ During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/lib/python3.4/multiprocessing/process.py", line 254, in _bootstrap self.run() File "/usr/lib/python3.4/multiprocessing/process.py", line 93, in run self._target(*self._args, **self._kwargs) File "managerTest.py", line 19, in f d[1] = ‘1‘ File "<string>", line 2, in __setitem__ File "/usr/lib/python3.4/multiprocessing/managers.py", line 728, in _callmethod self._connect() File "/usr/lib/python3.4/multiprocessing/managers.py", line 715, in _connect conn = self._Client(self._token.address, authkey=self._authkey) File "/usr/lib/python3.4/multiprocessing/connection.py", line 495, in Client c = SocketClient(address) File "/usr/lib/python3.4/multiprocessing/connection.py", line 624, in SocketClient s.connect(address) FileNotFoundError: [Errno 2] No such file or directory
关于代码部分,不做过多解释了就。在manager后对进程进行join后,问题消失,程序正常运行。从错误信息上看不出什么具体的原因,只是说当处理一个exception时候出现另一个异常......因为join函数官方文档的意思是:阻塞当前进程,直到调用join方法的那个进程执行完,再继续执行当前进程。所以定位问题的原因可能:
- 因为多个进程是共享数据(l,d),可能是因为多进程对数据进行修改时冲突-------但manager就是干这事的,所以基本可以排除。
- 因为当多哥进程运行时,主进程已经结束,所以报这个错误------为了测试这个问题,我在主进程末尾sleep了一下,但问题没有解决
- 因为manager内部原因,在manager管理进程的同时不可以进入主进程进行某些交互,无论主进程结束与否,进去主进程就是不行的-------我在manager内sleep了一下,程序正常运行了。-------具体的等有时间可以分析一下manager的源代码
这样进行一下总结:在使用manager管理/进行多进程及其数据交互时候,必须对每一个manager内的进程进行join-------待所有子进程完成后再回到主进程。
由于没有查看源代码进行研究,所以此结论如果不是此问题root cause 或者大家有什么想法,欢迎交流,感谢指正。
时间: 2024-10-25 19:58:18