Почему эта программа на Python иногда не может выйти? - PullRequest
6 голосов
/ 20 июня 2011

Я написал тестовую программу, в которой есть два процесса.Процесс-отец получает данные из очереди, а ребенок помещает в нее данные.Есть обработчик сигнала, который сообщает программе выйти.Однако иногда он не завершается, когда я отправляю сигнал 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()

1 Ответ

1 голос
/ 21 июня 2011

Если вы не используете Python 3, вы должны использовать xrange вместо range для такого большого цикла.Python имеет тенденцию задыхаться, когда он превышает определенный размер списка, поэтому вам действительно нужно перейти к генераторам к этому моменту.

Это очень хорошо может быть проблемой, которую вы видите прямо сейчас.

...