1

我有一个代码:

function_1()
function_2()

通常,function_1() 需要 10 个小时才能结束。但我希望 function_1() 运行 2 小时,2 小时后,function_1 必须返回,程序必须继续 function_2()。它不应该等待 function_1() 完成。有没有办法在python中做到这一点?

4

5 回答 5

2

使 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
于 2012-09-06T15:00:18.917 回答
1

您可以尝试使用模块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()
于 2012-09-12T12:48:12.703 回答
1

如果你不介意离开function_1跑步:

from threading import Thread
import time

Thread(target=function_1).start()
time.sleep(60*60*2)
Thread(target=function_2).start()
于 2012-09-06T10:09:51.713 回答
0

您可以使用 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
于 2012-09-12T13:15:09.020 回答
0
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
于 2012-09-06T13:22:35.460 回答