2012-07-16 14 views
5

ho lavorato su sistema di polling lungo. Io uso flask + mongokit + sedano + gevent.voglio usare gevent.evnet in celery.task

Quando si esegue il processo nel task sedano, gevent.event.set() non funziona. Quindi, voglio aiutarmi a capirlo. (Il motivo per cui uso il gevent allo stesso tempo con il sedano, c'è un enorme processo da trattare nel sistema di notifica)

ecco il mio codice di esempio.

#server.py 
@celery.task() 
def doing_task(uid, message): 
    notification = Notification() # this is a notification Model 
    notification.add(request.args.get('to'), some_notification) 
    app.event.set() 
    app.event.clear() 

@app.route('/main') 
def main(): 
    return render_template('main.html') 

@app.route('/set') 
def set(): 
    doing_task.delay(request.args.get('uid'), 'Notify') 
    return 'OK' 

@app.route('/poll') 
def poll(): 
    uid = request.args.get('uid') 
    app.event.wait() 
    if is_authorized(uid): #uid 1 is a authorized account 
     return Notification().get(uid) 

#main.html 
<body> 
    <button>Click me</button> 
</body> 
<script> 
    $('button').click(function(e) { 
    $.ajax({ 
    'url': '/set', 
    'data': 'uid=1', 
    'success': function(data) { 
     console.log(data); 
    } 
    }); 
    e.preventDefault(); 
    }); 

     var poll = function() { 
    return $.ajax({ 
      'url': '/poll', 
      'method': 'get', 
      'async':true, 
      'dataType': 'json', 
      'timeout': 10000, 
      'success': function(data) { 
      console.log(data); 
      setTimeout(poll, 50); 
      }, 
      'error':function (req,sta,er){ 
      setTimeout(poll, 3000); 
      }, 
     }); 
    }; 
    poll() 
</script> 

risposta

4

Ora, a Flask 0,9 Flask.app_context si aggiunge, con Flask.app_context è possibile ottenere un contesto di corrente.

Vedere Application Context.

Per esempio,

from flask import Flask 
from celery import Celery 

app = Flask(__name__) 
celery = Celery(__name__) 

@celery.task 
def hello(): 
    # Also, you are able to deal with current request as use test_request_context 
    with app.app_context(): 
     print current_app 
    with app.test_request_context() as request: 
     print('Hello {0!r}'.format(request)) 
Problemi correlati