2014-01-11 6 views
1

Взгляните на этот простой код питона с процессом:Прекратить Python процесса в течение ограниченного времени

from multiprocessing import Process 
import time 

def f(name): 
    time.sleep(100) 
    print 'hello', name 

if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) 
    p.start()#Has to be terminated in 5 seconds 
    #p.join() 
    print "This Needs to be Printed Immediately" 

Я предполагаю, что я ищу функцию как p.start(timeout).

Я хочу закончить процесс p, если он не закончил самостоятельно, как 5 секунд. Как я могу это сделать? Кажется, нет такой функции.

Если p.join() является раскомментирован следующей print линии придется подождать 100 секунд и не может быть «Печатный Immediately'.But Я хочу, чтобы это было сделано немедленно, поэтому p.join() должно быть закомментировано.

+0

Это, вероятно, не самый хороший вариант, но если вы действительно хотите процесс, вы должны быть в состоянии прервать его, посылая сигнал на (поскольку у вас есть доступ к его PID). –

ответ

1

Используйте отдельный поток, чтобы запустить процесс, подождите 5 секунд, а затем завершите процесс. В то же время основной поток может сделать работу, которую вы хотите, чтобы произойти сразу:

from multiprocessing import Process 
import time 
import threading 

def f(name): 
    time.sleep(100) 
    print 'hello', name 

def run_process_with_timeout(timeout, target, args): 
    p = Process(target=target, args=args) 
    p.start() 
    time.sleep(timeout) 
    p.terminate() 

if __name__ == '__main__': 
    t = threading.Thread(target=run_process_with_timeout, args=(5,f,('bob',))) 
    t.start() 
    print "This Needs to be Printed Immediately" 
+0

«Выполнение процесса в отдельной теме» Очень интересное решение. –

0

Вы правы, такой функции нет в Python 2.x в библиотеке подпроцессов. Однако, с Python 3.3 вы можете использовать:

p = subprocess.Popen(...) 
try: 
    p.wait(timeout=5) 
except TimeoutError: 
    p.kill() 

В старых версиях Python, вы должны написать цикл, который вызывает p.poll() и проверяет код возврата, например, раз в секунду.

Это (как и опрос вообще), не оптимальный с точки зрения производительности, но всегда зависит от того, что вы ожидаете.

1

Возможно, вы захотите взглянуть на that SO thread.

В основном их решение заключается в использовании возможности тайм-аута модуля потоковой передачи, запустив процесс в отдельном потоке.

0

попробовать что-то вроде этого:

def run_process_with_timeout(timeout, target, args): 
    p = Process(target=target, args=args) 
    running = False 
    second = int(time.strftime("%S")) 
    if second+timeout > 59: 
     second = (second+timeout)-60 
    else: 
     second = second+timeout 
    print second 
    while second > int(time.strftime("%S")): 
     if running == False: 
      p.start() 
      running = True 
    p.terminate() 

в основном только с помощью модуля времени, чтобы петля работать в течение пяти секунд, а затем переход на это означает, что тайм-аут задается в секундах. Хотя я бы отметил, что если бы это использовалось с кодом, который первоначально был опубликован OP, это сработало бы, поскольку печать была в второй функции отдельно от цикла и была бы выполнена сразу после вызова этой функции.

0

Почему бы не использовать опцию тайм-аута Process.join(), как:

import sys 
... 
if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) 
    p.start()#Has to be terminated in 5 seconds 
    # print immediately and flush output 
    print "This Needs to be Printed Immediately" 
    sys.stdout.flush() 
    p.join(5) 
    if p.is_alive(): 
     p.terminate() 
+0

Вы решили эту конкретную проблему, а что, если строка 'print' на самом деле является линией' return'? Тогда ваш код не будет работать. –

+0

В вашем вопросе вы заявили, что хотите, чтобы этот 'print' был немедленно, так что я и говорил. Если вы хотите выйти из программы и по-прежнему автоматически убивать прошу через 5 секунд, вам нужно будет запустить процесс демона, который при необходимости будет выполнять команды p.join (5) и p.terminate(). См. Http://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process.daemon – miraculixx

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