Python多处理异常处理

2024-10-04 05:31:27 发布

您现在位置:Python中文网/ 问答频道 /正文

鉴于以下程序结构,我正在寻找一种方法:

  • 检测父进程中的子故障

  • 终止所有进程(父进程和子进程)并退出,状态代码为1

  • 在不放松最大队列大小的情况下实现上述目标

代码如下:

import multiprocessing


def worker1(queue1, queue2):
    while True:
        item = queue1.get()
        if item == 10:
            raise
        if item == 'stop':
            return
        # do something with item that generates multiple queue entries
        for x in xrange(1000):
            queue2.put(x)


def worker2(queue2, queue3):
    while True:
        item = queue2.get()
        if item == 'stop':
            return
        # do something with item, only one result to pass to the next queue
        queue3.put(1)


def worker3(queue3):
    while True:
        item = queue3.get()
        if item == 'stop':
            return
        # do something with item


def main():
    queue1 = multiprocessing.Queue()
    queue2 = multiprocessing.Queue(100)
    queue3 = multiprocessing.Queue(100)

    pool1 = multiprocessing.Pool(2, worker1, (queue1,queue2,))
    pool2 = multiprocessing.Pool(8, worker2, (queue2,queue3,))
    pool3 = multiprocessing.Pool(4, worker3, (queue3,))

    for i in xrange(100):
        queue1.put(i)
    for _ in range(pool1.__dict__['_processes']):
        queue1.put('stop')
    pool1.close()
    pool1.join()

    for _ in range(pool2.__dict__['_processes']):
        queue2.put('stop')
    pool2.close()
    pool2.join()

    for _ in range(pool3.__dict__['_processes']):
        queue3.put('stop')
    pool3.close()
    pool3.join()

    print 'finished'

if __name__ == '__main__':
    main()

谢谢!在


Tags: inforifput进程defitemmultiprocessing
1条回答
网友
1楼 · 发布于 2024-10-04 05:31:27

您有点误用了Pool对象。在

直接使用Process对象,而不是Pool对象。在

对worker函数进行编程,使其在引发异常时退出并返回错误代码。在

然后可以使用is_alive()方法检查进程是否仍在运行,并检查死进程的exitcode属性。在

相关问题 更多 >