【问题标题】:Stop code after time period [duplicate]时间段后停止代码[重复]
【发布时间】:2013-02-01 22:39:26
【问题描述】:

我想打电话给foo(n),但如果它运行超过 10 秒就停止它。有什么好的方法可以做到这一点?

我可以看到理论上我可以修改 foo 本身以定期检查它已经运行了多长时间,但我不想这样做。

【问题讨论】:

  • foo 里面有什么?它是一个循环吗?你打算将foo 作为不同的线程运行吗?
  • 我真的会考虑修改foo,否则请参阅此问题:stackoverflow.com/questions/492519/… 或此问题:stackoverflow.com/questions/4158502/…
  • @ATOzTOA 这是一段复杂的代码进行复杂的计算。那个代码不是我写的。
  • @felipa 那么,你是在不同的线程中运行它吗?
  • @ATOzTOA 目前没有线程。不过,您的链接看起来很有希望。

标签: python


【解决方案1】:

给你:

import multiprocessing
import time

# Your foo function
def foo(n):
    for i in range(10000 * n):
        print "Tick"
        time.sleep(1)

if __name__ == '__main__':
    # Start foo as a process
    p = multiprocessing.Process(target=foo, name="Foo", args=(10,))
    p.start()

    # Wait 10 seconds for foo
    time.sleep(10)

    # Terminate foo
    p.terminate()

    # Cleanup
    p.join()

这将等待foo 10 秒,然后将其杀死。

更新

只有在进程正在运行时才终止它。

# If thread is active
if p.is_alive():
    print "foo is running... let's kill it..."

    # Terminate foo
    p.terminate()

更新 2:推荐

jointimeout 一起使用。如果foo 在超时之前完成,那么 main 可以继续。

# Wait a maximum of 10 seconds for foo
# Usage: join([timeout in seconds])
p.join(10)

# If thread is active
if p.is_alive():
    print "foo is running... let's kill it..."

    # Terminate foo
    p.terminate()
    p.join()

【讨论】:

  • 谢谢!理想情况下,我只想在进程尚未终止的情况下才终止该进程。有没有办法检查这个?
  • @felipa 是的,检查我更新的答案...
  • 非常感谢(尽管您的答案中没有出现timeout)。这是非常有用和信息丰富的。如果有人支持这个问题(链接的问题似乎没有这么有用的答案),那么我当然会支持你。我目前似乎不能。
  • @Goldname 这并不重要。这是我通常使用的安全构造。您不希望线程在导入时运行。
  • 我们如何从 foo 中返回值?
【解决方案2】:
import signal

#Sets an handler function, you can comment it if you don't need it.
signal.signal(signal.SIGALRM,handler_function) 

#Sets an alarm in 10 seconds
#If uncaught will terminate your process.
signal.alarm(10) 

超时时间不是很精确,但如果你不需要极高的精确度也可以。

另一种方法是使用资源模块,并设置最大CPU时间。

【讨论】:

  • 你可以稍微扩展一下以显示它如何终止函数foo而不是整个python脚本?我希望我的脚本继续执行,只是为了让对 foo 的调用在 10 秒后超时。
  • 编写一个函数处理程序来执行此操作,例如在函数的每次迭代中检查全局变量,并在信号处理程序中更改该变量。
  • @LtWorf OP 已经说过该函数是一个复杂的函数,而不是单个循环。所以,这行不通。
  • 我必须看到一个不使用循环或递归的复杂函数。
  • 提醒一下,信号只在主线程中有效,所以对于使用多线程的人来说,使用信号模块可能不是一个好主意
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多