Python 多处理中管理器的行为
我在Python 3中找不到对此行为的解释:Python 多处理中管理器的行为,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,我在Python 3中找不到对此行为的解释: from multiprocessing import Process, cpu_count, freeze_support, Manager class A: def __init__(self): # self._manager = Manager() # self._list = self._manager.list() manager = Manager() self
from multiprocessing import Process, cpu_count, freeze_support, Manager
class A:
def __init__(self):
# self._manager = Manager()
# self._list = self._manager.list()
manager = Manager()
self._list = manager.list()
def producer(self):
processes = []
cores = cpu_count()
for i in range(cores):
process = Process(target=self.worker)
process.start()
processes.append(process)
for process in processes:
process.join()
def worker(self):
print('I was called')
if __name__ == '__main__':
freeze_support()
a = A()
a.producer()
在\uuuu init\uuuu
中使用此选项:
self._manager = Manager()
self._list = self._manager.list()
我在调用process.start()
时收到一个错误OSError:handle已关闭
在\uuuu init\uuuu
中使用此选项:
manager = Manager()
self._list = manager.list()
一切似乎都起作用了
我读过,但找不到解释为什么在上面的示例中,Manager()
的实例不能是变量。我最好的猜测是因为Manager()
本身就是一个进程,通过这样的调用target=self.worker
我试图打破处理进程的一些逻辑
问题:我说得对吗?还是我错过了什么
完全回溯:
Traceback (most recent call last):
File "G:/files-from-server/apps/test_module/test_export.py", line 27, in <module>
a.producer()
File "G:/files-from-server/apps/test_module/test_export.py", line 15, in producer
process.start()
File "c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\process.py", line 105, in start
self._popen = self._Popen(self)
File "c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\context.py", line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
reduction.dump(process_obj, to_child)
File "c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
File "c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\connection.py", line 939, in reduce_pipe_connection
dh = reduction.DupHandle(conn.fileno(), access)
File "c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\connection.py", line 170, in fileno
self._check_closed()
File "c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\connection.py", line 136, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
回溯(最近一次呼叫最后一次):
文件“G:/server/apps/test_module/test_export.py中的文件”,第27行,在
a、 制作人()
文件“G:/producer第15行服务器/apps/test_模块/test_export.py中的文件”
process.start()
文件“c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\process.py”,第105行,在开始处
self.\u popen=self.\u popen(self)
文件“c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\context.py”,第223行,在
返回_default_context.get_context().Process._Popen(Process_obj)
文件“c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\context.py”,第322行,在
返回Popen(过程对象)
文件“c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\popen\u spawn\u win32.py”,第65行,在\uuu init中__
减少.转储(进程对象,到子进程)
文件“c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\reduce.py”,第60行,转储文件
ForkingPickler(文件、协议).dump(obj)
文件“c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\connection.py”,第939行,位于reduce\u pipe\u connection中
dh=reduce.DupHandle(conn.fileno(),access)
文件“c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\connection.py”,第170行,文件号
自我检查关闭()
文件“c:\users\maxim\appdata\local\programs\python\python36-32\Lib\multiprocessing\connection.py”,第136行,检查\u关闭
升起操作错误(“手柄关闭”)
操作错误:句柄已关闭
请包含完整的回溯,而不仅仅是错误。@roganjosh我添加了完整的回溯