如何在python、windows平台中强制执行超时函数

如何在python、windows平台中强制执行超时函数,python,timeout,urllib2,Python,Timeout,Urllib2,如果函数在此之前没有返回,我只想让它超时 它之所以启动,是因为urllib2支持urlopen的超时,但不支持读取部分 我的程序挂起了。更改套接字的defaulttimeout无效。使用signal.sigalrm 不起作用。我不能切换到请求,因为那样我将不得不重写和测试更多 我不想让线程运行函数,然后让线程超时,我想让函数超时。有什么想法吗?我喜欢在我的项目中使用大卫的课程。我发现它非常有效,而且我喜欢它提供了一种通过装饰器在现有代码中实现的简单方法。例如: # Timeout after 3

如果函数在此之前没有返回,我只想让它超时

它之所以启动,是因为urllib2支持
urlopen
的超时,但不支持读取部分 我的程序挂起了。更改套接字的
defaulttimeout
无效。使用
signal.sigalrm
不起作用。我不能切换到请求,因为那样我将不得不重写和测试更多


我不想让线程运行函数,然后让线程超时,我想让函数超时。有什么想法吗?

我喜欢在我的项目中使用大卫的课程。我发现它非常有效,而且我喜欢它提供了一种通过装饰器在现有代码中实现的简单方法。例如:

# Timeout after 30 seconds
@timeout(30)
def your_function():
    ...

注意:这不是线程安全的!如果使用多线程,信号将被随机线程捕获。但是,对于单线程程序,这是最简单的解决方案。

是的,它可以在windows中完成,无需信号,也可以在其他操作系统中工作。这是使用线程,但不是运行函数,而是发出超时信号。逻辑是创建一个新线程并等待给定的时间,然后使用_-thread(python3中的线程和python2中的线程)引发异常。此异常将在主线程中抛出,如果发生任何异常,with块将退出

import threading
import _thread   # import thread in python2
class timeout():
  def __init__(self, time):
    self.time= time
    self.exit=False

  def __enter__(self):
    threading.Thread(target=self.callme).start()

  def callme(self):
    time.sleep(self.time)
    if self.exit==False:
       _thread.interrupt_main()  # use thread instead of _thread in python2
  def __exit__(self, a, b, c):
       self.exit=True
常用示例:-

with timeout(2):
    func()

with块中的程序应在2秒钟内退出,否则将在2秒钟后退出。

很遗憾,我使用的是windows,windows不支持signal.sigalrm。您指向的代码使用signal.sigalrm