将 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 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
CANT_REREAD: Celery 中的格式字符串.%h
php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - Sharedaddy
php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - Sharedaddy