【问题标题】:Python gevent+bottle. Querying an API. How to use gevent to prevent timeout locks?Python gevent+瓶子。查询 API。如何使用gevent防止超时锁?
【发布时间】:2013-01-28 09:37:21
【问题描述】:

我正在使用 gevent + bottle 进行以下操作:

  1. 在远程服务器上调用 API 方法
  2. API 处理结果
  3. 返回 HTML

我已经为 API 调用 (httplib/socket) 设置了一个 tiemout,但如果它设置为 5 秒(例如),我的 python 脚本在这段时间内很忙,无法返回任何其他页面(即正常)。

问题: 我能以某种方式巧妙地使用 gevent(也许是在一个单独的脚本中?)来处理这么长的请求吗?

我正在考虑在 localhost:8080 上启动一个单独的 API 询问脚本并将其放在负载均衡器后面(如“Internet”所建议的那样),但我确信一定有更好的方法。

我不是一个经验丰富的程序员,所以谢谢你的帮助!

【问题讨论】:

    标签: python api asynchronous timeout gevent


    【解决方案1】:

    其实你的问题不应该存在。 gevent 服务器后端可以同时处理任意数量的请求。如果一个被阻塞 5 秒,这不会影响到达服务器的其他请求。这就是 gevent 服务器后端的重点。

    1) 您确定您正确使用了 gevent 服务器后端吗?而不仅仅是 wsgiref 默认服务器(单线程)的猴子补丁版本?

    2) 你是通过bottle.py --server gevent 启动服务器的吗?如果没有,您在导入所有其他与套接字相关的东西(包括瓶子)之前是否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')
    

    【讨论】:

    • 谢谢你,defnull。你已经回答了我的问题。您能否向我解释一下为什么我现在无法设置任何超时或实际测试多个 greenlet 如何在后台运行?说,我想人为地将超时设置为 30 秒(由于某种原因,猴子修补它会立即超时)
    • Monkey 补丁通过立即切换到另一个 greenlet 使所有阻塞调用非阻塞。超时是一个阻塞调用,这就是您所看到的。
    • @TonySepia:只是出于好奇,你有没有机会知道你的问题是由编写 bottle.py 的人回答的???
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2021-05-17
    • 2018-12-22
    • 2014-07-09
    相关资源
    最近更新 更多