2015-02-27 2 views
1

Моя цель - создать новый процесс, который будет принимать число в виде ввода от пользователя в цикле и отображать его квадрат. Если пользователь не вводит число в течение 10 секунд, процесс должен завершиться (а не основным процессом). Я использую threading.Timer с multiprocessing.Исходный родительский процесс Python из потока

Пробовал Код

from threading import Timer 
import multiprocessing as mp 
import time 

def foo(stdin): 
    while True: 
     t = Timer(10, exit,()) 
     t.start() 
     print 'Enter a No. in 10 Secs: ', 
     num = int(stdin.readline()) 
     t.cancel() 
     print 'Square of', num, 'is', num*num 

if __name__ == '__main__': 
    newstdin = os.fdopen(os.dup(sys.stdin.fileno())) 
    proc1 = mp.Process(target = foo, args = (newstdin,)) 
    proc1.start() 
    proc1.join() 
    print "Exit" 
    newstdin.close() 

Но это не работает. Вместо exit Я пробовал с sys.exit, взял proc1 как global и попробовал proc1.terminate, но все равно никакого решения.

+1

Использование 'threading.Timer' с' multiprocessing.Process' может быть не счастливой парой, попробуйте не смешивать потоки и процессы. http://stackoverflow.com/questions/25297627/why-no-timer-class-in-pythons-multiprocessing-module – d6bels

+0

@ d6bels Я читал его в некоторых местах. Но другого способа добиться того, чего я хочу, нет. – RatDon

+1

Ну, пока вы используете таймер только в подпроцессе, я не думаю, что это так плохо ;-) – d6bels

ответ

1

Заменено exitos._exit и оно работает должным образом.

t = Timer(10, os._exit, [0]) 

os._exit занимает ровно 1 argument, следовательно, мы должны упомянуть 0 в списке. (В threading.Timer передать аргументы функции, аргументы должны быть в list.)

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