2011-10-08 1 views
0

il y a un demo sur comment implémenter la comète en utilisant gevent + flask.comment implémenter la comète via l'événement de 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() 

utilise la classe d'événement de gevent. Si quelqu'un publie un message, n'importe qui dans la salle de chat recevra le message.

et si je veux juste quelqu'un pour recevoir le message? devrais-je utiliser gevent.event.AsyncResult? Dans l'affirmative, comment le faire?

Répondre

0

Utilisez gevent.queue.Queue. La lecture de la file d'attente supprime le message et s'il y a plusieurs lecteurs, chaque message sera livré à exactement l'un d'entre eux (dont un n'est pas spécifié, il n'y a pas d'aléatoire ou d'équité, c'est juste arbitraire).

+0

merci pour vos conseils, mais il semble utiliser redis + gevent.sleep est une meilleure solution – limboy