【问题标题】:Why does this python program sometimes fail to exit?为什么这个python程序有时会退出失败?
【发布时间】:2011-09-18 14:34:24
【问题描述】:

我写了一个测试程序,它有两个进程。父进程从队列中获取数据,子进程将数据放入其中。有一个信号处理程序告诉程序退出。但是,当我将信号 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()

【问题讨论】:

  • 哇... 100,000,000 你不是在开玩笑吧?
  • @cwallenpoole 我只想让它运行很长时间....
  • 嗯,已经在后台运行了20分钟,还没到50,000,000
  • @cwallenpoole 你找到我上面提到的问题了吗?您应该将 SIGTERM 发送给子进程,而不是等待自己退出。
  • 我认为您在 queue.put 方法中阻塞,Python 中的信号不会中断本机代码中阻塞的操作。但是我不明白为什么父进程不清除队列。

标签: python queue multiprocessing signals


【解决方案1】:

除非你运行的是 python 3,否则你应该使用 xrange 而不是 range 来实现这么大的循环。一旦超过某个列表大小,Python 往往会窒息,所以到那时你真的需要转移到生成器。

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

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2012-07-26
    相关资源
    最近更新 更多