我正在尝试使用龙卷风和gunicorn 来编写一个应用程序来处理工作线程。我创建了如下所示的代码,但是尽管启动了多个工作程序,但它并没有共享请求。一名工作人员似乎一直在处理所有请求(不是间歇性的)。
Code:
from tornado.web import RequestHandler, asynchronous, Application
from tornado.ioloop import IOLoop
import time
from datetime import timedelta
import os
class MainHandler(RequestHandler):
def get(self):
print "GET start"
print "pid: "+str(os.getpid())
time.sleep(3)
self.write("Hello, world.<br>pid: "+str(os.getpid()))
print "GET finish"
app = Application([
(r"/", MainHandler)
])
控制台中的输出(我在 3 秒窗口内轻松刷新了 3 个浏览器选项卡,但它们仍然使用相同的进程并按顺序运行):
2014-04-12 20:57:52 [30465] [INFO] Starting gunicorn 18.0
2014-04-12 20:57:52 [30465] [INFO] Listening at: http://127.0.0.1:8000 (30465)
2014-04-12 20:57:52 [30465] [INFO] Using worker: tornado
2014-04-12 20:57:52 [30474] [INFO] Booting worker with pid: 30474
2014-04-12 20:57:52 [30475] [INFO] Booting worker with pid: 30475
2014-04-12 20:57:52 [30476] [INFO] Booting worker with pid: 30476
2014-04-12 20:57:52 [30477] [INFO] Booting worker with pid: 30477
GET start
pid: 30474
GET finish
GET start
pid: 30474
GET finish
GET start
pid: 30474
GET finish
我也尝试过将 IOLoop.add_timeout 与异步一起使用,在这种情况下没有更好的了。通过阅读,我意识到,gunicorn 甚至可能以某种方式查看内部并将异步装饰器解释为意味着它可以将它们全部填充到一个线程中,因此我恢复了此处所示的内容。只是为了我的理智,我已经粘贴箱 http://pastebin.com/Npzep1JG我所做的事情的未经编辑的版本。
总之,为什么gunicorn 不将我的请求分配给工作人员?
好吧,显然是浏览器造成了这种情况。通过查看wireshark,我确定至少firefox(并且我假设chrome正在做同样的事情)在URL相同时序列化请求。也许这样的话,如果它们是可缓存的,它就可以重用它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)