将 gevent.evnet 与 celery.task 一起使用

Posted

技术标签:

【中文标题】将 gevent.evnet 与 celery.task 一起使用【英文标题】:Using gevent.evnet with celery.task 【发布时间】:2012-07-15 03:56:02 【问题描述】:

我一直在研究一个长轮询系统。我使用烧瓶 + mongokit + celery + gevent。

当 celery 任务中的进程完成后,gevent.event.set() 不起作用。我需要帮助来解决这个问题。 (我之所以和celery同时使用gevent,是因为Notification系统中有一个庞大的进程需要处理。)

这是我的示例代码。

 #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>

【问题讨论】:

【参考方案1】:

现在,在 Flask 0.9 中添加了Flask.app_context,使用Flask.app_context,您可以获得当前的上下文。

见Application Context。

例如,

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))

【讨论】:

以上是关于将 gevent.evnet 与 celery.task 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Django-配置celery

CANT_REREAD: Celery 中的格式字符串.%h

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - Sharedaddy

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - Sharedaddy

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - Sharedaddy

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - 分享此功能