Celery任务挂着http请求

时间:2015-06-08 17:22:40

标签: python flask celery

我正在测试芹菜任务并且偶然发现问题。如果在任务中存在带有请求的代码(通过urllib.urlopen),那么它就会挂起。可能是什么原因?

我只是尝试使用Flask启动最小配置。 我使用rabbitmq和redis作为经纪人和后端,但结果是一样的。

带有任务的

文件(run_celery.py):

...import celery and flask app...

celery = Celery(
    app.import_name,
    backend=app.config['CELERY_BROKER_URL'],
    broker=app.config['CELERY_BROKER_URL']
)

@celery.task
def test_task(a):
    print(a)
    print(requests.get('http://google.com'))

通过这种方式我启动了工人: celery -A run_celery.celery worker -l debug

在此之后,我运行ipython并调用任务。

from run_celery import test_task
test_task.apply_async(('sfas',))

工人开始执行任务:

...
Received task: run_celery.test_task...
sfas
Starting new HTTP connection (1)...

此后它就悬空了。

仅当任务包含请求时,此行为才有效。 我做错了什么?

1 个答案:

答案 0 :(得分:0)

我在我的代码中找到了理由并且非常想知道O_o。我不知道为什么会发生这种情况,但是在带有任务的文件中,存在导入模型,当它正在执行时,然后执行初始化实例MagentoAPI(https://github.com/bernieke/python-magento)。如果我注释掉这个初始化,那么celery任务中的请求就会正确执行。