Python gevent+bottle. 查询API。如何使用gevent防止超时锁?

3 投票
1 回答
4157 浏览
提问于 2025-04-17 13:54

我正在使用 gevent 和 bottle 来做以下事情:

  1. 调用远程服务器上的 API 方法
  2. 处理 API 返回的结果
  3. 返回 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')

撰写回答