2011-10-08 46 views
0

有关于如何使用gevent + flask实现彗星的demo如何通过gevent的事件实现彗星

#coding:utf-8 
''' 
Created on Aug 6, 2011 

@author: Alan Yang 
''' 
import time 
from gevent import monkey 
monkey.patch_all() 

from gevent.event import Event 
from gevent.pywsgi import WSGIServer 

from flask import Flask,request,render_template,jsonify 

app = Flask('FlaskChat') 
app.event = Event() 
app.cache = [] 
app.cache_size = 12 

@app.route('/') 
def index(): 
    return render_template('index.html',messages=app.cache) 

@app.route('/put',methods=['POST']) 
def put_message(): 
    message = request.form.get('message','') 
    app.cache.append('{0} - {1}'.format(time.strftime('%m-%d %X'),message.encode('utf-8'))) 
    if len(app.cache) >= app.cache_size: 
     app.cache = app.cache[-1:-(app.cache_size):-1] 
    app.event.set() 
    app.event.clear() 
    return 'OK' 

@app.route('/poll',methods=['POST']) 
def poll_message(): 
    app.event.wait() 
    return jsonify(dict(data=[app.cache[-1]])) 


if __name__ == '__main__': 
    #app.run(debug=True) 
    WSGIServer(('0.0.0.0',5000),app,log=None).serve_forever() 

它使用gevent的事件类。如果有人发布消息,聊天室中的任何人都会收到消息。

如果我只是想某人接收消息?我应该使用gevent.event.AsyncResult吗?如果是这样,该怎么做?

回答

0

使用gevent.queue.Queue

从队列中读取将删除该消息,如果有多个读者,每个消息将被传递给它们中的一个(尽管没有指定,但没有随机性或公平性,它只是任意的)。

+0

感谢您的建议,但似乎使用redis + gevent.sleep是一个更好的解决方案 – limboy