Форум сайта python.su
0
python 2.7.4
ubuntu 13.04
Помогите разобраться в причине возникновения дедлока.
Есть одна очередь, в нее пишут по 1000 объектов два процесса. Оба процесса завершают писать в очередь но висят как живые. Подскажите в чем причина?
from multiprocessing import Process, Queue, current_process from time import sleep #проверяю есть ли в списке живые процессы def is_alive(processes): for process in processes: if process.is_alive(): return True #пишу в очередь def worker_write(q): for i in xrange(1000): q.put({"key1": 'test', 'key2': 'test', 'key3': 'test'}) print(current_process().name + ' -> End.') raw = Queue() pr = [] for i in xrange(2): process = Process(target=worker_write, args=(raw,)) process.start() pr.append(process) while is_alive(pr): sleep(1)
Отредактировано weez (Окт. 14, 2013 18:16:18)
Офлайн
33
Офлайн
0
Lexander
http://stackoverflow.com/questions/7827290/pythons-multiprocessing-queue-process-properly-terminating-both-programs
for i in xrange(1)
for i in xrange(2)
Отредактировано weez (Окт. 14, 2013 18:34:10)
Офлайн
173
Во-первых, вместо is_alive() правильнее join().
Во-вторых, очередь нужно прочитать, чтобы процесс мог завершиться: http://stackoverflow.com/a/12456550/1052325
from multiprocessing import Process, Queue, current_process def worker_write(q): for i in xrange(1000): q.put({"key1": 'test', 'key2': 'test', 'key3': 'test'}) q.put(None) print(current_process().name + ' -> End.') if __name__ == '__main__': results = Queue() pr = [] num_workers = 2 for i in xrange(num_workers): process = Process(target=worker_write, args=(results,)) process.start() pr.append(process) while num_workers: item = results.get() if item is None: num_workers -= 1 for process in pr: process.join()
Офлайн
33
weezЭто не важно, там код правильный именно в тех местах, где у вас ошибки.
У меня другой вопрос
Офлайн
0
reclosedevв конечном варианте главный процесс будет делать что-то свое(join не подходит) пока дети делают свою работу.
Во-первых, вместо is_alive() правильнее join().
reclosedevпочему тогда когда в первом примере я создаю 1 процесс, все завершается нормально хотя очередь я не читаю а только пишу в нее?
Во-вторых, очередь нужно прочитать, чтобы процесс мог завершиться:
Отредактировано weez (Окт. 15, 2013 06:26:41)
Офлайн
33
weezЕсли процессов несколько, возможно, лучше использовать Pool.
в конечном варианте главный процесс будет делать что-то свое(join не подходит) пока дети делают свою работу.
weezКогда вы вызываете is_alive у завершившего работу дочернего процесса, он автоматически присоединяется к главному (неявный join).
почему тогда когда в первом примере я создаю 1 процесс, все завершается нормально хотя очередь я не читаю а только пишу в нее?
Офлайн
0
Спасибо за обьеснение
Офлайн