如何在单个应用程序中使用Gevent和Tornado



我正在努力在同一应用程序中使用gevent和tornado,以便不支持龙卷风的iOloop的库可以使用gevent来不同步。我认为我需要运行两个真实的系统线程,一个专门用于龙卷风的Ioloop,另一个专门用于Gevent的循环。但是,尝试调用系统线程中的任何GEVENT函数返回not implemented Errorgevent cannot be used inside threads。因此,我也尝试了猴子修补线程,因为以下片段显示

from gevent import monkey; monkey.patch_all()
from random import choice
import gevent
import requests
import tornado.ioloop
import tornado.web
import threading
import Queue
q = Queue.Queue()
i = 0
def synchronous_get_url(url, callback=None):
    global i
    i += 1
    d = i
    print('bar %d getting %s' % (d, url))
    requests.get(url)
    print('bar %d finished getting %s' % (d, url))
    if callback:
        callback()
class GreenEventLoop(threading.Thread):
    daemon = True
    def run(self):
        while True:
            url, callback = q.get()
            gevent.spawn(synchronous_get_url, url, callback)

继续...

class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        print 'Received get request'
        urls = [
            'http://google.com',
            'http://apple.com',
            'http://microsoft.com',
            'http://github.com',
            'http://sourceforge.com',
        ]
        q.put((choice(urls), self._on_fetch), block=False)
        self.write("submitted url to queue")
    def _on_fetch(self):
        print 'Finishing in the handlern'
        try:
            self.finish()
        except:
            pass
# Start GEvent Loop
green_loop = GreenEventLoop()
green_loop.start()
# Start Tornado Loop
application = tornado.web.Application([
    (r"/", MainHandler),
    ], debug=True)
application.listen(7001)
tornado.ioloop.IOLoop.instance().start()

在单独的过程中,在命令行上,我运行以下内容。

from gevent import monkey; monkey.patch_all()
import gevent
import requests
count = 0
def get_stuff(i):
    global count
    res = requests.get('http://localhost:7000/')
    count += 1
    print count, res, i
lets = [gevent.spawn(get_stuff, i) for i in range(15)]
gevent.joinall(lets)

这允许同时检索15个URL,并在接收到的响应时返回。我不太了解的是为什么上述代码完全有效。如果螺纹被gevent修补并变成绿色线程,则意味着一次只有一个线程,这意味着虽然gevent却没有提供新的响应,但龙卷风的iOloop会阻止并且不处理新请求,直到旧的请求回。有人可以解释Gevent如何与Tornado的Ioloop互动?

我建议您看电动机lib,它是pymongo驱动程序周围的异步包装器。它使用Greenlets采用同步Pymongo代码作为龙卷风回调样式。因此,我认为这应该是找到一些想法的好地方。

基本思想是使用gevent来修补系统线程,然后在python'threads'下运行龙卷风,这确实是gevent greenlets。

如何一起使用gevent和tornado

相关内容

  • 没有找到相关文章

最新更新