Я прочитал много сообщений об использовании потоков , подпроцессы и т. д. Многие из них кажутся слишком сложными для того, что я пытаюсь сделать ...
Все, что я хочу сделать, это прекратить выполнение функции по истечении X времени.
def big_loop(bob):
x = bob
start = time.time()
while True:
print time.time()-start
Эта функция - это бесконечный цикл, который никогда не вызывает ошибок или исключений, точка. Я не уверен в разнице между «командами, оболочками, подпроцессами, потоками и т. Д.» И этой функцией, поэтому у меня проблемы с манипулированием подпроцессами.
Я нашел здесь этот код и попробовал его, но как вы можете видеть, что он продолжает печатать по прошествии 10 секунд:
import time
import threading
import subprocess as sub
import time
class RunCmd(threading.Thread):
def __init__(self, cmd, timeout):
threading.Thread.__init__(self)
self.cmd = cmd
self.timeout = timeout
def run(self):
self.p = sub.Popen(self.cmd)
self.p.wait()
def Run(self):
self.start()
self.join(self.timeout)
if self.is_alive():
self.p.terminate()
self.join()
def big_loop(bob):
x = bob
start = time.time()
while True:
print time.time()-start
RunCmd(big_loop('jimijojo'), 10).Run() #supposed to quit after 10 seconds, but doesn't
x = raw_input('DONEEEEEEEEEEEE')
Какой простой способ отключить эту функцию? Как вы можете видеть в моей попытке выше, она не завершается через 20 секунд, а просто продолжает работать ...
*** Ой также, я читал об использовании сигнала, но я работаю в Windows, поэтому я не могу использовать функцию будильника .. (python 2.7)
** предполагаю "бесконечно работающую функцию" нельзя манипулировать или изменить так, чтобы она не была бесконечной, если бы я мог изменить функцию, я бы просто изменил ее на небесконечную, не так ли?
Вот несколько похожих вопросов, которых у меня нет 'Я могу портировать свой код для работы с моей простой функцией: Может быть, вы сможете?
Python: убить или завершить подпроцесс по истечении времени ожидания
замена signal.alarm в Windows [Python]
Хорошо, я попробовал полученный ответ, он работает .. но как я могу его использовать, если я удалить оператор if __name__ == "__main __":
? Когда я удаляю этот оператор, цикл никогда не заканчивается, как раньше.
import multiprocessing
import Queue
import time
def infinite_loop_function(bob):
var = bob
start = time.time()
while True:
time.sleep(1)
print time.time()-start
print 'this statement will never print'
def wrapper(queue, bob):
result = infinite_loop_function(bob)
queue.put(result)
queue.close()
#if __name__ == "__main__":
queue = multiprocessing.Queue(1) # Maximum size is 1
proc = multiprocessing.Process(target=wrapper, args=(queue, 'var'))
proc.start()
# Wait for TIMEOUT seconds
try:
timeout = 10
result = queue.get(True, timeout)
except Queue.Empty:
# Deal with lack of data somehow
result = None
finally:
proc.terminate()
print 'running other code, now that that infinite loop has been defeated!'
print 'bla bla bla'
x = raw_input('done')