为什么这个python程序有时候无法退出?

ren*_*ish 6 python queue signals multiprocessing

我写了一个测试程序,它有两个进程.父进程从队列中获取数据,子进程将数据放入其中.有一个信号处理程序告诉程序退出.但是,当我将信号SIGTERM发送到我打印的pid(子进程)时,它有时不会退出,它似乎有一个死锁.

import os
import sys 
import multiprocessing
import time
import signal

bStop = False
def worker(que):
    signal.signal(signal.SIGTERM,sighandler)
    print 'worker:',os.getpid()
    for i in range(100000000):
        que.put(i)

    print 'STOP'

def sighandler(num,frame):
    print 'catch signal'
    q.put('STOP')
    sys.exit(0)
q = multiprocessing.Queue(100)
p = multiprocessing.Process(target=worker,args=(q,))
p.start()

for item in iter(q.get,'STOP'):
    print 'get',item
    pass
print 'main stop'
p.join()
Run Code Online (Sandbox Code Playgroud)

Joh*_*ohn 1

除非您运行的是 python 3,否则您应该使用 xrange 而不是 range 来处理这么大的循环。一旦超过一定的列表大小,Python 就会变得窒息,所以到那时你真的需要转向生成器。

这很可能就是您现在看到的问题。