2015-01-28 2 views
1

У меня есть сценарий питона, который выглядит следующим образом:завершить все процессы в пуле

import os 
import tempfile 
from multiprocessing import Pool 

def runReport(a, b, c): 
    # do task. 
    temp_dir = tempfile.gettempdir() 
    if (os.path.isfile(temp_dir + "/stop_check")): 
     # How to terminate all processes in the pool here? 

def runReports(args): 
    return runReport(*args) 

def main(argv): 
    pool = Pool(4) 
    args = [] 
    # Code to generate args. args is an array of tuples of form (a, b, c) 
    pool.map(runReports, args) 

if (__name__ == '__main__'): 
main(sys.argv[1:]) 

Там есть еще один питон скрипт, который создает этот файл/TMP/stop_check. Когда этот файл создается, мне нужно завершить пул. Как я могу это достичь?

+1

Вы спрашиваете: «Как прекратить многопроцессорное обслуживание?»? или «Как прослушать событие создания файла?» – ThinkChaos

+0

'pool.terminate()' завершает процессы в пуле. – Jeff

+0

@plg Я очень новичок в python, я пробовал передать пул функции runReport, чтобы я мог называть 'pool.terminate()' там. Но я не мог этого сделать, потому что пул не умеет мариновать. Мне нужно найти способ вызвать 'pool.terminate()' при создании файла/tmp/stop_check. – Pankaj

ответ

0

Только родительский процесс может завершить пул. Вы лучше, родительский запустить цикл, который проверяет наличие этого файла, а не пытаться, чтобы каждый ребенок это сделать, а затем сигнал родителей как-то:

import os 
import sys 
import time 
import tempfile 
from multiprocessing import Pool 

def runReport(*args): 
    # do task 

def runReports(args): 
    return runReport(*args) 

def main(argv): 
    pool = Pool(4) 
    args = [] 
    # Code to generate args. args is an array of tuples of form (a, b, c) 
    result = pool.map_async(runReports, args) 
    temp_dir = tempfile.gettempdir() 
    while not result.ready(): 
     if os.path.isfile(temp_dir + "/stop_check"): 
      pool.terminate() 
      break 
     result.wait(.5) # Wait a bit to avoid pegging the CPU. You can tune this value as you see fit. 

if (__name__ == '__main__'): 
    main(sys.argv[1:]) 

Используя map_async вместо map, вы можете использовать родительский цикл для проверки наличия файла, а затем, когда это необходимо, прекратить пул. Не используйте то, что с помощью terminate, чтобы убить детей, означает, что они вообще не получат никакой очистки, поэтому вам нужно убедиться, что никто из них не получает доступ к ресурсам, которые могут остаться в несогласованном состоянии, если процесс умирает при их использовании ,

Смежные вопросы