我正在测试芹菜任务并且偶然发现问题。如果在任务中存在带有请求的代码(通过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)...
此后它就悬空了。
仅当任务包含请求时,此行为才有效。 我做错了什么?
答案 0 :(得分:0)
我在我的代码中找到了理由并且非常想知道O_o。我不知道为什么会发生这种情况,但是在带有任务的文件中,存在导入模型,当它正在执行时,然后执行初始化实例MagentoAPI(https://github.com/bernieke/python-magento)。如果我注释掉这个初始化,那么celery任务中的请求就会正确执行。