一个python多进程错误

一个python多进程错误,python,multiprocess,Python,Multiprocess,我这里有一个multprocess演示,我遇到了一些问题。研究了一个晚上,我无法解决原因。 有人能帮我吗 我想让一个父进程充当生产者,当有任务出现时,父进程可以派生一些子进程来使用这些任务。父级监视子级,如果任何一个异常退出,则可以由父级重新启动 #!/usr/bin/env python # -*- coding: utf-8 -*- from multiprocessing import Process, Queue from Queue import Empty import sys,

我这里有一个multprocess演示,我遇到了一些问题。研究了一个晚上,我无法解决原因。 有人能帮我吗

我想让一个父进程充当生产者,当有任务出现时,父进程可以派生一些子进程来使用这些任务。父级监视子级,如果任何一个异常退出,则可以由父级重新启动


#!/usr/bin/env python
# -*- coding: utf-8 -*-

from multiprocessing import Process, Queue from Queue import Empty import sys, signal, os, random, time import traceback

child_process = []
child_process_num = 4
queue = Queue(0)

def work(queue):
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    signal.signal(signal.SIGTERM, signal.SIG_DFL)
    signal.signal(signal.SIGCHLD, signal.SIG_DFL)

    time.sleep(10) #demo sleep 

def kill_child_processes(signum, frame):
    #terminate all children
    pass

def restart_child_process(signum, frame):
    global child_process

    for i in xrange(len(child_process)):
        child = child_process[i]

        try:
            if child.is_alive():
                continue
        except OSError, e:
            pass

        child.join() #join this process to make sure there is no zombie process

        new_child = Process(target=work, args=(queue,))
        new_child.start()
        child_process[i] = new_child #restart one new process

        child = None
        return

if __name__ == '__main__':
    reload(sys)
    sys.setdefaultencoding("utf-8")

    for i in xrange(child_process_num):
        child = Process(target=work, args=(queue,))
        child.start()
        child_process.append(child)

    signal.signal(signal.SIGINT, kill_child_processes)
    signal.signal(signal.SIGTERM, kill_child_processes) #hook the SIGTERM
    signal.signal(signal.SIGCHLD, restart_child_process)
    signal.signal(signal.SIGPIPE, signal.SIG_DFL)
当该程序运行时,将出现如下错误:

Error in atexit._run_exitfuncs: Error in sys.exitfunc: Traceback (most recent call last): File "/usr/local/python/lib/python2.6/atexit.py", line 30, in _run_exitfuncs traceback.print_exc() File "/usr/local/python/lib/python2.6/traceback.py", line 227, in print_exc print_exception(etype, value, tb, limit, file) File "/usr/local/python/lib/python2.6/traceback.py", line 124, in print_exception _print(file, 'Traceback (most recent call last):') File "/usr/local/python/lib/python2.6/traceback.py", line 12, in _print def _print(file, str='', terminator='\n'): File "test.py", line 42, in restart_child_process new_child.start() File "/usr/local/python/lib/python2.6/multiprocessing/process.py", line 99, in start _cleanup() File "/usr/local/python/lib/python2.6/multiprocessing/process.py", line 53, in _cleanup if p._popen.poll() is not None: File "/usr/local/python/lib/python2.6/multiprocessing/forking.py", line 106, in poll pid, sts = os.waitpid(self.pid, flag) OSError: [Errno 10] No child processes
[root@mail1 mail]# kill -SIGINT 32545 [root@mail1 mail]# Error in atexit._run_exitfuncs: Traceback (most recent call last): File "/usr/local/python/lib/python2.6/atexit.py", line 24, in _run_exitfuncs func(*targs, **kargs) File "/usr/local/python/lib/python2.6/multiprocessing/util.py", line 269, in _exit_function p.join() File "/usr/local/python/lib/python2.6/multiprocessing/process.py", line 119, in join res = self._popen.wait(timeout) File "/usr/local/python/lib/python2.6/multiprocessing/forking.py", line 117, in wait return self.poll(0) File "/usr/local/python/lib/python2.6/multiprocessing/forking.py", line 106, in poll pid, sts = os.waitpid(self.pid, flag) OSError: [Errno 4] Interrupted system call Error in sys.exitfunc: Traceback (most recent call last): File "/usr/local/python/lib/python2.6/atexit.py", line 24, in _run_exitfuncs func(*targs, **kargs) File "/usr/local/python/lib/python2.6/multiprocessing/util.py", line 269, in _exit_function p.join() File "/usr/local/python/lib/python2.6/multiprocessing/process.py", line 119, in join res = self._popen.wait(timeout) File "/usr/local/python/lib/python2.6/multiprocessing/forking.py", line 117, in wait return self.poll(0) File "/usr/local/python/lib/python2.6/multiprocessing/forking.py", line 106, in poll pid, sts = os.waitpid(self.pid, flag) OSError: [Errno 4] Interrupted system call atexit中出错。\u运行\u退出功能: sys.exitfunc中的错误: 回溯(最近一次呼叫最后一次): 文件“/usr/local/python/lib/python2.6/atexit.py”,第30行,在“运行”exitfuncs中 traceback.print_exc() 文件“/usr/local/python/lib/python2.6/traceback.py”,第227行,在print_exc中 打印异常(etype、value、tb、limit、file) 文件“/usr/local/python/lib/python2.6/traceback.py”,第124行,打印异常 _打印(文件“回溯(最近一次调用):”) 文件“/usr/local/python/lib/python2.6/traceback.py”,第12行,打印 def_print(文件,str='',terminator='\n'): 重新启动子进程中的文件“test.py”,第42行 新建_child.start() 文件“/usr/local/python/lib/python2.6/multiprocessing/process.py”,第99行,开始 _清理() 文件“/usr/local/python/lib/python2.6/multiprocessing/process.py”,第53行,在 如果p._popen.poll()不是无: 文件“/usr/local/python/lib/python2.6/multiprocessing/forking.py”,第106行,在轮询中 pid,sts=os.waitpid(self.pid,标志) OSError:[Errno 10]没有子进程 如果我向一个孩子发送信号:kill–SIGINT{child_pid},我将得到:

Error in atexit._run_exitfuncs: Error in sys.exitfunc: Traceback (most recent call last): File "/usr/local/python/lib/python2.6/atexit.py", line 30, in _run_exitfuncs traceback.print_exc() File "/usr/local/python/lib/python2.6/traceback.py", line 227, in print_exc print_exception(etype, value, tb, limit, file) File "/usr/local/python/lib/python2.6/traceback.py", line 124, in print_exception _print(file, 'Traceback (most recent call last):') File "/usr/local/python/lib/python2.6/traceback.py", line 12, in _print def _print(file, str='', terminator='\n'): File "test.py", line 42, in restart_child_process new_child.start() File "/usr/local/python/lib/python2.6/multiprocessing/process.py", line 99, in start _cleanup() File "/usr/local/python/lib/python2.6/multiprocessing/process.py", line 53, in _cleanup if p._popen.poll() is not None: File "/usr/local/python/lib/python2.6/multiprocessing/forking.py", line 106, in poll pid, sts = os.waitpid(self.pid, flag) OSError: [Errno 10] No child processes
[root@mail1 mail]# kill -SIGINT 32545 [root@mail1 mail]# Error in atexit._run_exitfuncs: Traceback (most recent call last): File "/usr/local/python/lib/python2.6/atexit.py", line 24, in _run_exitfuncs func(*targs, **kargs) File "/usr/local/python/lib/python2.6/multiprocessing/util.py", line 269, in _exit_function p.join() File "/usr/local/python/lib/python2.6/multiprocessing/process.py", line 119, in join res = self._popen.wait(timeout) File "/usr/local/python/lib/python2.6/multiprocessing/forking.py", line 117, in wait return self.poll(0) File "/usr/local/python/lib/python2.6/multiprocessing/forking.py", line 106, in poll pid, sts = os.waitpid(self.pid, flag) OSError: [Errno 4] Interrupted system call Error in sys.exitfunc: Traceback (most recent call last): File "/usr/local/python/lib/python2.6/atexit.py", line 24, in _run_exitfuncs func(*targs, **kargs) File "/usr/local/python/lib/python2.6/multiprocessing/util.py", line 269, in _exit_function p.join() File "/usr/local/python/lib/python2.6/multiprocessing/process.py", line 119, in join res = self._popen.wait(timeout) File "/usr/local/python/lib/python2.6/multiprocessing/forking.py", line 117, in wait return self.poll(0) File "/usr/local/python/lib/python2.6/multiprocessing/forking.py", line 106, in poll pid, sts = os.waitpid(self.pid, flag) OSError: [Errno 4] Interrupted system call [root@mail1邮件]#kill-SIGINT 32545 [root@mail1邮件]#atexit中出错。_运行_退出功能: 回溯(最近一次呼叫最后一次): 文件“/usr/local/python/lib/python2.6/atexit.py”,第24行,在“运行”exitfuncs中 func(*targs,**kargs) 文件“/usr/local/python/lib/python2.6/multiprocessing/util.py”,第269行,在退出函数中 p、 加入 文件“/usr/local/python/lib/python2.6/multiprocessing/process.py”,第119行,在join中 res=自身。\u popen.wait(超时) 文件“/usr/local/python/lib/python2.6/multiprocessing/forking.py”,第117行,正在等待 返回self.poll(0) 文件“/usr/local/python/lib/python2.6/multiprocessing/forking.py”,第106行,在轮询中 pid,sts=os.waitpid(self.pid,标志) OSError:[Errno 4]sys.exitfunc中中断的系统调用错误: 回溯(最近一次呼叫最后一次): 文件“/usr/local/python/lib/python2.6/atexit.py”,第24行,在“运行”exitfuncs中 func(*targs,**kargs) 文件“/usr/local/python/lib/python2.6/multiprocessing/util.py”,第269行,在退出函数中 p、 加入 文件“/usr/local/python/lib/python2.6/multiprocessing/process.py”,第119行,在join中 res=自身。\u popen.wait(超时) 文件“/usr/local/python/lib/python2.6/multiprocessing/forking.py”,第117行,正在等待 返回self.poll(0) 文件“/usr/local/python/lib/python2.6/multiprocessing/forking.py”,第106行,在轮询中 pid,sts=os.waitpid(self.pid,标志) OSError:[Errno 4]中断了系统调用
主进程正在等待所有子进程在退出之前终止,因此有一个阻塞调用(即wait4)注册为at_退出句柄。您发送的信号会中断阻塞调用,从而中断堆栈跟踪

我不清楚的是,发送给子进程的信号是否会被重定向到父进程,然后父进程会中断wait4调用。这与Unix进程组行为有关