2015-06-08 21 views
1

我正在測試芹菜任務,並且遇到了問題。如果在任務中存在具有請求的代碼(通過urllib.urlopen),則它掛起。什麼原因可以是?芹菜任務掛在http請求

我只是嘗試啓動與Flask的最小配置。 我使用rabbitmq和redis作爲broker和後端,但結果是一樣的。

文件(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')) 

這樣,我又推出了工人: 芹菜-A run_celery.celery工人-l調試

在此之後,我運行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

你在redis中的任務是什麼狀態?如果向請求添加超時會發生什麼情況? – bwarren2

+0

@ bwarren2 沒有。如果我爲urlopen設置超時,Python必須引發異常,但沒有任何事情發生。它看起來像芹菜任務掛。 –

+0

@ bwarren2 當任務正在執行和掛,內redis的只存在3個鍵: '127.0.0.1:6379>鍵* 1) 「_kombu.binding.celeryev」 2) 「_kombu.binding.celery.pidbox」 3)「_kombu.binding.celery」' –

回答

0

我在我的代碼中找到了原因,非常想知道O_o。我不知道爲什麼會發生這種情況,但在任務文件中,存在導入模型和執行時,然後執行初始化實例MagentoAPI(https://github.com/bernieke/python-magento)。如果我註釋掉這個初始化,那麼celery任務中的請求將正確執行。