我有一个代码:
function_1()
function_2()
通常,function_1() 需要 10 个小时才能结束。但我希望 function_1() 运行 2 小时,2 小时后,function_1 必须返回,程序必须继续 function_2()。它不应该等待 function_1() 完成。有没有办法在python中做到这一点?
使 Python 中的函数能够中断它们的执行和恢复的原因是使用了“yield”语句——然后你的函数将作为生成器对象工作。您在此对象上调用“next”方法以使其在最后一次 yield 后启动或继续
import time
def function_1():
start_time = time.time()
while True:
# do long stuff
running_time = time.time() -start_time
if running_time > 2 * 60 * 60: # 2 hours
yield #<partial results can be yield here, if you want>
start_time = time.time()
runner = function_1()
while True:
try:
runner.next()
except StopIteration:
# function_1 had got to the end
break
# do other stuff
您可以尝试使用模块Gevent:在线程中启动函数并在一段时间后终止该线程。
这是示例:
import gevent
# function which you can't modify
def func1(some_arg)
# do something
pass
def func2()
# do something
pass
if __name__ == '__main__':
g = gevent.Greenlet(func1, 'Some Argument in func1')
g.start()
gevent.sleep(60*60*2)
g.kill()
# call the rest of functions
func2()
如果你不介意离开function_1
跑步:
from threading import Thread
import time
Thread(target=function_1).start()
time.sleep(60*60*2)
Thread(target=function_2).start()
您可以使用 datetime 模块对执行进行计时。可能您的优化器函数在某处有一个循环。在循环内部,您可以测试自启动函数以来已经过去了多少时间。
def function_1():
t_end = datetime.time.now() + datetime.timedelta(hours=2)
while not converged:
# do your thing
if datetime.time.now() > t_end:
return
from multiprocessing import Process
p1 = Process(target=function_1)
p1.start()
p1.join(60*60*2)
if p1.is_alive():p1.terminate()
function_2()
我希望这有帮助
我刚刚使用以下代码对此进行了测试
import time
from multiprocessing import Process
def f1():
print 0
time.sleep(10000)
print 1
def f2():
print 2
p1 = Process(target=f1)
p1.start()
p1.join(6)
if p1.is_alive():p1.terminate()
f2()
输出如预期:
0
2