Python gevent+bottle. 查询API。如何使用gevent防止超时锁?
我正在使用 gevent 和 bottle 来做以下事情:
- 调用远程服务器上的 API 方法
- 处理 API 返回的结果
- 返回 HTML 页面
我为 API 调用设置了一个超时时间(使用 httplib/socket),但是如果我把这个时间设置为 5 秒(比如说),那么我的 Python 脚本在这 5 秒内就会一直忙着处理这个请求,无法返回其他页面(这很正常)。
问题是:我能不能用 gevent 的某种聪明方法(可能是在一个单独的脚本中)来处理这种长时间的请求呢?
我在想能不能在 localhost:8080 上启动一个单独的脚本来询问 API,然后把它放在负载均衡器后面(就像“互联网”建议的那样),但我相信一定有更好的方法。
我不是一个有经验的程序员,所以谢谢你的帮助!
1 个回答
11
其实,你的问题根本不应该存在。gevent服务器后端可以同时处理任意数量的请求。如果有一个请求被阻塞了5秒,这并不会影响到其他到达服务器的请求。这就是gevent服务器后端的特点。
1) 你确定你正确使用了gevent服务器后端吗?而不是仅仅使用了一个被修改过的wsgiref默认服务器(它是单线程的)?
2) 你是通过 bottle.py --server gevent
启动服务器的吗?如果不是,你是否在导入其他与socket相关的内容(包括bottle)之前,执行了 gevent.monkey.patch_all()
?
举个例子:
from gevent import monkey
monkey.patch_all()
import bottle
import urllib2
@bottle.route(...)
def callback():
urllib2.open(...)
bottle.run(server='gevent')