Python的多处理管理器dict连接错误

我正在尝试与多处理共享一个词典。 问题类似于以下内容

但是建议的解决方案对我不起作用(添加process.join())。 一个最小的代码示例是:

import multiprocessing as mp
from multiprocessing import Manager


def test(i,multi_cache):
    print(i)
    multi_cache[i] = 'Test'
    print('inside',multi_cache.items())
    


with Manager() as manager:
    multi_cache = manager.dict()

    processes = [mp.Process(target=test,args=(i,multi_cache)) for i in range(3)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()

    print(multi_cache.items())

输出为:

0
1
inside [(0,'Test'),(1,'Test')]
2

然后我得到这个错误

Process Process-8:
Process Process-6:
Traceback (most recent call last):
Traceback (most recent call last):
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/process.py",line 258,in _bootstrap
    self.run()
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/process.py",line 93,in run
    self._target(*self._args,**self._kwargs)
  File "<ipython-input-3-c78e9bf0d6ec>",line 8,in test
    print('inside',multi_cache.items())
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/managers.py",line 749,in _callmethod
    conn = self._tls.connection
  File "<string>",line 2,in items
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/managers.py",line 757,in _callmethod
    kind,result = conn.recv()
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/connection.py",line 250,in recv
    buf = self._recv_bytes()
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/connection.py",line 407,in _recv_bytes
    buf = self._recv(4)
AttributeError: 'ForkAwareLocal' object has no attribute 'connection'
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/connection.py",line 379,in _recv
    chunk = read(handle,remaining)
During handling of the above exception,another exception occurred:
Traceback (most recent call last):
ConnectionResetError: [Errno 104] Connection reset by peer
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/process.py",line 7,in test
    multi_cache[i] = 'Test'
  File "<string>",in __setitem__
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/managers.py",line 753,in _callmethod
    self._connect()
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/managers.py",line 741,in _connect
    dispatch(conn,None,'accept_connection',(name,))
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/managers.py",line 79,in dispatch
    kind,result = c.recv()
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/connection.py",in _recv_bytes
    buf = self._recv(4)
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/connection.py",remaining)
ConnectionResetError: [Errno 104] Connection reset by peer
Traceback (most recent call last):
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/managers.py",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 "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/site-packages/IPython/core/interactiveshell.py",line 2961,in run_code
    exec(code_obj,self.user_global_ns,self.user_ns)
  File "<ipython-input-3-c78e9bf0d6ec>",line 21,in <module>
    print(multi_cache.items())
  File "<string>",line 740,in _connect
    conn = self._Client(self._token.address,authkey=self._authkey)
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/connection.py",line 487,in Client
    c = SocketClient(address)
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/connection.py",line 614,in SocketClient
    s.connect(address)
ConnectionRefusedError: [Errno 111] Connection refused

奇怪的是,当仅启动一个Process时,错误略有不同并在print语句处中断:

Traceback (most recent call last):
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/managers.py",self.user_ns)
  File "<ipython-input-2-d7a43009862c>",line 493,in Client
    answer_challenge(c,authkey)
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/connection.py",line 732,in answer_challenge
    message = connection.recv_bytes(256)         # reject large message
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/connection.py",line 216,in recv_bytes
    buf = self._recv_bytes(maxlength)
  File "/home/user/src/anaconda3/envs/pythonenv/lib/python3.6/multiprocessing/connection.py",remaining)
ConnectionResetError: [Errno 104] Connection reset by peer

我正在使用Python 3.6.10在ubuntu 16.04上尝试此操作。任何想法如何解决这个问题?谢谢!

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...