我们正在尝试使用
multiprocessing
模块来执行这段代码:import multiprocessing as mp
ctx = mp.get_context("spawn")
(child, pipe) = ctx.Pipe(duplex=True)
job_process = ctx.Process(
name="my_job",
target=job_func,
args=(
child,
server_info,
manager,
job_config,
config_file,
),
)
job_process.start()
我们在Python 3.8中遇到了以下错误,而在Python 3.6中没有看到:
Traceback (most recent call last):
File "path/to/venv/lib/python3.8/site-packages/path/to/file.py", line 137, in includeme
job_process.start()
File "/usr/lib/python3.8/multiprocessing/process.py", line 121, in start
self._popen = self._Popen(self)
File "/usr/lib/python3.8/multiprocessing/context.py", line 284, in _Popen
return Popen(process_obj)
File "/usr/lib/python3.8/multiprocessing/popen_spawn_posix.py", line 32, in __init__
super().__init__(process_obj)
File "/usr/lib/python3.8/multiprocessing/popen_fork.py", line 19, in __init__
self._launch(process_obj)
File "/usr/lib/python3.8/multiprocessing/popen_spawn_posix.py", line 47, in _launch
reduction.dump(process_obj, fp)
File "/usr/lib/python3.8/multiprocessing/reduction.py", line 63, in dump
ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle 'weakref' object
这个过程的启动方式或提供的参数是否需要更改或检查?任何方向都会受到赞赏!
job_func
、server_info
、manager
、job_config
或config_file
中的一个秘密地引用了一个Process
对象(可能通过多层引用),因此无法被pickle化(您可以尝试手动逐个pickle它们以找出哪个是)。这就是为什么[MCVE]很重要的原因;我实际上无法重现您的问题,所以我所能做的就是猜测您可能已经做了什么而没有向我展示。 - ShadowRangermanager
是一个类的实例,其__init__
方法调用另一个方法来创建一个multiprocessing.Process
。这是通过另一个在导致weakref
错误的特定代码片段的config.include
之前的config.include
来启动的。这两个都需要在Pyramid服务器启动时使用config.include
进行初始化。您有什么建议可以在includeme
函数中实现或检查导入保护,以便config.include
调用它? - aaron02import sys
,然后执行print(sys.modules['__main__'])
来找出实际作为入口点的文件,并手动检查该文件。如果它在函数外部进行任何导入和模块初始化操作,而没有导入保护,则可能存在问题,但很可能不存在。 - ShadowRanger