在下面的简单Python 3示例中,我们使用multiproessing
模块处理列表friends
,是什么导致了错误:
TypeError: new() missing 1 required positional argument: 'name'
如果只是运行,则不会发生错误
tom = Friend(tom)
say_hello(tom)
有没有办法解决这个问题?谢谢大家!
代码
import multiprocessing
def say_hello(friend):
print('Hello', friend.name, '!')
class Friend:
friends = {}
def __new__(cls, name):
if name not in cls.friends:
cls.friends[name] = super(Friend, cls).__new__(cls)
return cls.friends[name]
def __init__(self, name):
self.name = name
jack = Friend('jack')
ryan = Friend('ryan')
friends = [jack, ryan]
multiprocessing.Pool(2).map(say_hello, friends)
完整错误跟踪
Traceback (most recent call last):
File "/Users/nyxynyx/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
self.run()
File "/Users/nyxynyx/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
self._target(*self._args, **self._kwargs)
File "/Users/nyxynyx/opt/anaconda3/lib/python3.7/multiprocessing/pool.py", line 110, in worker
task = get()
File "/Users/nyxynyx/opt/anaconda3/lib/python3.7/multiprocessing/queues.py", line 354, in get
return _ForkingPickler.loads(res)
TypeError: __new__() missing 1 required positional argument: 'name'
定义
__reduce__
以使Friend
类的对象可pickle化(可序列化)以发送到其他进程取消勾选期间出错,因为在取消勾选期间重新创建对象时,
name
未准备好传递它可以通过以下方式复制:
解决方案是实现^{} 或^{}
因此,在你的情况下:
相关问题 更多 >
编程相关推荐