首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python运行带有超时的代码的正确方法

问使用Python运行带有超时的代码的正确方法
EN

Stack Overflow用户
提问于 2011-08-04 18:59:19
回答 8查看 19.3K关注 0票数 32

我在网上查了一下,发现了一些关于运行带超时的代码的讨论和ActiveState菜谱。看来有一些常见的方法:

  • 使用运行代码的线程,并在join中设置超时。如果超时时间过了-关闭线程。在Python (使用私有_Thread__stop函数)中不直接支持这一点,所以它是坏实践。
  • 使用signal.SIGALRM --但是这种方法不适用于!
  • 使用带超时的子进程--但这是太重的--如果我想经常启动可中断的任务,我不希望每个进程都启动。

那么,什么是是正确的方式?我不是在问解决方法(例如使用Twisted和异步IO),而是实际解决实际问题的方法--我有一些功能,我只想在超时的情况下运行它。如果超时时间过了,我想要恢复控制权。我希望它能在Linux和Windows上运行。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-08-11 14:46:21

一个完全通用的解决方案,真的,老实说,是不存在的。您必须为给定的域使用正确的解决方案。

  • 如果你想让你完全控制的代码超时,你必须写它来合作。这样的代码必须能够以某种方式分解成小块,比如在事件驱动的系统中。您也可以通过线程来实现这一点,如果您能够确保任何东西都不会持有太长时间的锁,但是正确地处理锁实际上非常困难。
  • 如果由于担心代码失控而需要超时(例如,如果您担心用户会要求计算机计算9**(9**9)),则需要在另一个进程中运行它。这是充分隔离它的唯一简单方法。仅在事件系统或其他线程中运行它是不够的。还可以像其他解决方案一样将事情分解成小块,但需要非常小心的处理,而且通常不值得这样做;无论如何,这不允许您执行与运行Python代码相同的操作。
票数 10
EN

Stack Overflow用户

发布于 2011-08-09 07:45:45

您可能需要的是多处理模块。如果subprocess太重,那么这也可能不适合您的需要。

代码语言:javascript
复制
import time
import multiprocessing

def do_this_other_thing_that_may_take_too_long(duration):
    time.sleep(duration)
    return 'done after sleeping {0} seconds.'.format(duration)

pool = multiprocessing.Pool(1)
print 'starting....'
res = pool.apply_async(do_this_other_thing_that_may_take_too_long, [8])
for timeout in range(1, 10):
    try:
        print '{0}: {1}'.format(duration, res.get(timeout))
    except multiprocessing.TimeoutError:
        print '{0}: timed out'.format(duration) 

print 'end'
票数 10
EN

Stack Overflow用户

发布于 2011-08-11 17:48:35

如果它与网络相关,您可以尝试:

代码语言:javascript
复制
import socket
socket.setdefaulttimeout(number)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6947065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档