首页 > 代码库 > python:join及其在manager中的问题分析

python:join及其在manager中的问题分析

  在学习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方法的那个进程执行完,再继续执行当前进程。所以定位问题的原因可能:

  1. 因为多个进程是共享数据(l,d),可能是因为多进程对数据进行修改时冲突-------但manager就是干这事的,所以基本可以排除。
  2. 因为当多哥进程运行时,主进程已经结束,所以报这个错误------为了测试这个问题,我在主进程末尾sleep了一下,但问题没有解决
  3. 因为manager内部原因,在manager管理进程的同时不可以进入主进程进行某些交互,无论主进程结束与否,进去主进程就是不行的-------我在manager内sleep了一下,程序正常运行了。-------具体的等有时间可以分析一下manager的源代码

  这样进行一下总结:在使用manager管理/进行多进程及其数据交互时候,必须对每一个manager内的进程进行join-------待所有子进程完成后再回到主进程。

 

  由于没有查看源代码进行研究,所以此结论如果不是此问题root cause 或者大家有什么想法,欢迎交流,感谢指正。

 

python:join及其在manager中的问题分析