Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在尝试使用SharedMemoryManager(python 3.8)替换BaseManager时会出现名称错误?_Python_Python 3.x_Multiprocessing_Python Multiprocessing_Shared Memory - Fatal编程技术网

为什么在尝试使用SharedMemoryManager(python 3.8)替换BaseManager时会出现名称错误?

为什么在尝试使用SharedMemoryManager(python 3.8)替换BaseManager时会出现名称错误?,python,python-3.x,multiprocessing,python-multiprocessing,shared-memory,Python,Python 3.x,Multiprocessing,Python Multiprocessing,Shared Memory,Python3.8引入了新的共享内存特性。我们正在尝试使用SharedMemoryManager,并抛出NameError 我认为我们可能会在复杂的场景中出错,所以我使用python文档片段将其分解 试试看: #python>=3.8 从multiprocessing.managers导入SharedMemoryManager作为管理器 除: #python

Python3.8引入了新的共享内存特性。我们正在尝试使用
SharedMemoryManager
,并抛出
NameError

我认为我们可能会在复杂的场景中出错,所以我使用python文档片段将其分解

试试看:
#python>=3.8
从multiprocessing.managers导入SharedMemoryManager作为管理器
除:
#python<3.8
从multiprocessing.managers导入BaseManager作为管理器
类数学类:
def添加(自身、x、y):
返回x+y
def mul(自身、x、y):
返回x*y
班级经理(经理):
通过
MyManager.register('数学',数学类)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
使用MyManager()作为管理器:
数学=经理
打印(数学。添加(4,3))#打印7
打印(数学.mul(7,8))#打印56
这在很大程度上取自多处理文档(除了回退导入),在python 3.7中运行良好,但在python 3.8中抛出以下错误:

Traceback (most recent call last):
  File "scripts/debug_shared_memory_issue.py", line 21, in <module>
    maths = manager.Maths()
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 740, in temp
    token, exp = self._create(typeid, *args, **kwds)
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 625, in _create
    id, exposed = dispatch(conn, None, 'create', (typeid,)+args, kwds)
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 91, in dispatch
    raise convert_to_error(kind, result)
multiprocessing.managers.RemoteError: 
---------------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 210, in handle_request
    result = func(c, *args, **kwds)
  File "/usr/lib/python3.8/multiprocessing/managers.py", line 1312, in create
    if hasattr(self.registry[typeid][-1], "_shared_memory_proxy"):
NameError: name 'self' is not defined
---------------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“scripts/debug\u shared\u memory\u issue.py”,第21行,在
数学=经理
文件“/usr/lib/python3.8/multiprocessing/managers.py”,第740行,在temp中
令牌,exp=self.\u创建(typeid,*args,**kwds)
文件“/usr/lib/python3.8/multiprocessing/managers.py”,第625行,在创建
id,exposed=dispatch(conn,None,'create',(typeid,)+args,kwds)
文件“/usr/lib/python3.8/multiprocessing/managers.py”,第91行,在分派中
引发转换为错误(种类、结果)
multiprocessing.managers.RemoteError:
---------------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python3.8/multiprocessing/managers.py”,第210行,在handle\u请求中
结果=func(c,*args,**kwds)
文件“/usr/lib/python3.8/multiprocessing/managers.py”,第1312行,在create中
如果hasattr(self.registry[typeid][1],“\u共享\u内存\u代理”):
NameError:未定义名称“self”
---------------------------------------------------------------------------
Python3.8的发行说明和文档中说,
SharedMemoryManager
是“BaseManager的一个子类”,因此我们希望它可以作为替代品。但事实似乎并非如此。我们做错了什么?看看CPython当前的3.8分支,似乎没有相关的变化。在Python3.9中,
create
函数中有一个显式的
self
arg。但是3.9是WIP,所以我们不希望在生产软件中使用它

谢谢你的帮助

这是(v3.9.0a1)中修复的错误

您可以从以下位置进行修补:

从multiprocessing.managers导入SharedMemoryManager作为管理器
导入系统
如果系统版本信息<(3,9):
从multiprocessing.managers导入服务器,SharedMemoryServer
定义创建(self、c、typeid、/、*args、**kwargs):
如果hasattr(self.registry[typeid][1],“\u共享\u内存\u代理”):
kwargs['shared_memory_context']=self.shared_memory_context
return Server.create(self、c、typeid、*args、**kwargs)
SharedMemoryServer.create=create

谢谢!我今天会试试这个,如果它有效的话,我会接受这个答案。你知道有没有计划在3.8中解决这个问题吗?