Python multiprocessing.Manager和os.fork产生奇怪的行为
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python multiprocessing.Manager和os.fork产生奇怪的行为,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2166字,纯文字阅读大概需要4分钟。
内容图文
![Python multiprocessing.Manager和os.fork产生奇怪的行为](/upload/InfoBanner/zyjiaocheng/778/2afcc0418bb6413eb22fe0368e56f09a.jpg)
我的同事用他正在研究的守护程序脚本问了我的问题.他遇到了一个涉及multiprocessing.Manager的奇怪错误,我设法用以下五行重现:
import multiprocessing, os, sys
mgr = multiprocessing.Manager()
pid = os.fork()
if pid > 0:
sys.exit(0)
在CentOS 6 Linux和Python 2.6上运行时,我收到以下错误:
Traceback (most recent call last):
File "/usr/lib64/python2.6/multiprocessing/util.py", line 235, in _run_finalizers
finalizer()
File "/usr/lib64/python2.6/multiprocessing/util.py", line 174, in __call__
res = self._callback(*self._args, **self._kwargs)
File "/usr/lib64/python2.6/multiprocessing/managers.py", line 576, in _finalize_manager
if process.is_alive():
File "/usr/lib64/python2.6/multiprocessing/process.py", line 129, in is_alive
assert self._parent_pid == os.getpid(), 'can only test a child process'
AssertionError: can only test a child process
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
File "/usr/lib64/python2.6/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/usr/lib64/python2.6/multiprocessing/util.py", line 269, in _exit_function
p.join()
File "/usr/lib64/python2.6/multiprocessing/process.py", line 117, in join
assert self._parent_pid == os.getpid(), 'can only join a child process'
AssertionError: can only join a child process
Error in sys.exitfunc:
Traceback (most recent call last):
File "/usr/lib64/python2.6/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/usr/lib64/python2.6/multiprocessing/util.py", line 269, in _exit_function
p.join()
File "/usr/lib64/python2.6/multiprocessing/process.py", line 117, in join
assert self._parent_pid == os.getpid(), 'can only join a child process'
AssertionError: can only join a child process
我怀疑错误是由于os.fork和multiprocessing.Manager之间的某些交互,并且他应该使用多处理模块来创建新进程而不是os.fork.谁能证实这一点和/或解释发生了什么?如果我的预感是正确的,为什么这是使用os.fork的错误地方?
解决方法:
问题是Manager创建了一个进程并尝试在sys.exit上停止它.由于在fork期间(懒惰)复制进程的内存,父进程和子进程都会尝试停止进程并等待它停止.但是,作为例外,只提到父进程可以做到这一点.如果不使用os.fork,则使用multiprocessing.Process,它将生成一个新进程,该进程不会尝试在sys.exit上关闭Manager.
内容总结
以上是互联网集市为您收集整理的Python multiprocessing.Manager和os.fork产生奇怪的行为全部内容,希望文章能够帮你解决Python multiprocessing.Manager和os.fork产生奇怪的行为所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。