我读过很多关于使用线程、子进程等的文章。。很多事情对我来说太复杂了。。。
我要做的就是在X个时间之后停止执行一个函数。def big_loop(bob):
x = bob
start = time.time()
while True:
print time.time()-start
这个函数是一个无止境的循环,从不抛出任何错误或异常,句点。
我不确定“命令、shell、子进程、线程等等”和这个函数之间的区别,这就是为什么我在操作子进程时遇到麻烦的原因。
我在这里找到了这个代码,并尝试了它,但正如您所看到的,它在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)
**假设“无限运行的函数”不能被操纵或改变成非无限的,如果我能改变函数,那么我就把它改变成非无限的,不是吗?
下面是一些类似的问题,我无法通过它们的代码来处理我的简单函数:
也许你能?
好吧,我试着回答了,我收到了,它起作用了。。但是,如果删除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')