【问题标题】:Bottle with CherryPy does not behave multi-threaded when same end-point is called当调用相同的端点时,带有 CherryPy 的瓶子不会表现出多线程
【发布时间】:2015-08-15 06:50:34
【问题描述】:

据我所知,当与 CherryPy 服务器一起使用时,Bottle 应该是多线程的。我有一个简单的测试程序:

from bottle import Bottle, run
import time

app = Bottle()

@app.route('/hello')
def hello():
    time.sleep(5)

@app.route('/hello2')
def hello2():
    time.sleep(5)

run(app, host='0.0.0.0', server="cherrypy", port=8080)

当我通过打开 2 个选项卡并同时刷新它们来调用 localhost:8080/hello 时,它们不会同时返回,但其中一个在 5 秒后完成,另一个在 5 秒后完成.

但是当我同时在一个选项卡中调用 /hello 并在另一个选项卡中调用 /hello2 时,它们同时完成。

为什么当同一个端点被调用两次时,Bottle 不表现为多线程?有没有办法让它多线程?

Python 版本:2.7.6

瓶装版本:0.12.8

CherryPy 版本:3.7.0

操作系统:在 Ubuntu 14.04 64 位和 Windows 10 64 位上都试过

【问题讨论】:

  • 这是一个有趣的观察。您是否尝试过使用不同的 Web 服务器来查看是否也是这种情况?以paste 为例
  • 看看(有点老):blog.schmichael.com/2007/09/20/…
  • @emartinelli 但在 OPs 情况下,第二个端点在访问第一个端点时不会阻塞(与链接中的情况不同)

标签: python multithreading cherrypy bottle


【解决方案1】:

几乎可以肯定是您的浏览器在序列化请求。尝试使用两个不同的,或者更好的是真正的客户。使用curl 不会为我重现。

【讨论】:

    【解决方案2】:

    我已经在回答 one question 时遇到了这种行为,这让我感到困惑。如果您会四处搜索相关问题,那么该列表会一直持续下去。

    怀疑是服务器端对 Keep-Alive、HTTP 管道、缓存策略等的一些不正确处理。但实际上它与服务器端完全无关。由于浏览器缓存实现(Firefox、Chromium),到达同一 URL 的并发请求会被序列化。 The best answer 在直接搜索 bugtrackers 之前发现,说:

    Necko 的缓存每个缓存条目只能处理一个写入器。因此,如果您对同一个 URL 发出多个请求,第一个请求将打开缓存条目进行写入,后面的请求将阻塞打开的缓存条目,直到第一个请求完成。

    确实,如果您在 Firebug 或 DevTools 中禁用缓存,效果不会持续存在。

    因此,如果您的客户端不是浏览器,例如 API,请忽略该问题。否则,如果您确实需要从一个浏览器向同一 URL(普通请求或 XHR)发出并发请求,请添加随机查询字符串参数以使请求 URL 唯一,例如http://example.com/concurrent/page?nocache=1433247395.

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 2023-03-12
      • 2022-01-09
      • 1970-01-01
      • 2014-01-08
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多