比如下面代码示例中的 timeout
import requests
requests.get(url = 'http://www.google.com.hk', timeout=5)
代码中不存在一个计时线程来实现 timeout,我盲猜,实现的原理就是:用户程序向操作系统注册一个 timeout 的 timer,时间到了,操作系统就给应用程序一个中断信号。是这样吗?
如果我想自己实现一个任意 timeout 的程序,应该怎么做?
不限于 HTTP 的 timeout
OS 提供了什么 API 让我做这件事情?
有什么资料可供参考,使得我了解更多吗?
我需要的是一个任意解,调用任何即便没有任何系统调用的函数,都可以任意设置 timeout 的解决方案
不一定,有的是定时器,有的是用 select 模拟的,有的是操作系统 API 本身就提供了 timeout 相关设置。
但要是具体到某一个接口上的话,我们看源码就知道它是如何实现的了:
timeout 参数最后传进了 conn.urlopen 方法里,而 conn 是 urllib3 库里提供的对象,那我们接着跟踪:
发现是用 select 模拟的。
最后 Python 中如果你想用的比较通用的超时机制的话,可以用
eventlet.Timeout
/gevent.Timeout
来实现。你也可以像你在题目里说的那样,用 signal 自己封装一下,不过由于 Windows 下不支持 signal,所以如果你有跨平台的需要的话就不能这么做了。