2012-10-02 65 views
19

我需要從Eclipse調試器調試Celery任務。 我使用Eclipse,PyDev和Django。如何調試在Eclipse中本地運行的Celery/Django任務

首先,我在Eclipse中打開我的項目,並在任務函數的開頭放置一個斷點。

然後,我通過右鍵單擊來自PyDev包資源管理器的manage.py並選擇「Debug As-> Python Run」並指定「celeryd -l info」作爲參數,從Eclipse啓動Celery工作者。這啓動了MainThread,Mediator和另外三個線程,這些線程從Eclipse調試器中可見。

之後,我返回到PyDev的看法,並開始通過右鍵點擊主應用程序的項目,並選擇運行方式/ PyDev的:Django的

我的問題是,一旦任務由mytask.delay提交()它不會停在斷點上。我用任務代碼放了一些痕跡,以便我可以看到它在一個工作線程中執行。

那麼,如何讓Eclipse調試器在Celery工作線程中執行任務時停止在放置任務的斷點處?

回答

28

您應該考慮選擇在與主進程相同的線程中運行celery任務(通常它在單獨的進程上運行),這將使調試更容易。

你可以告訴芹菜通過增加此設置你的settings.py模塊運行在同步任務:

CELERY_ALWAYS_EAGER = True 

注:這只是意味着要一直使用調試或發展階段!

+0

謝謝,這部分解決了這個問題。但是如果我需要在不同線程中並行運行時調試任務呢? – spoonboy

+3

pdb呢?看到這裏http://docs.celeryproject.org/en/latest/tutorials/debugging.html –

+0

你看,我真的不需要遠程調試它。我只想在不同的線程中在Eclipse中進行本地調試。 – spoonboy

-1

如果它只在一個不同的線程上運行,它應該在最新的PyDev版本上工作(我認爲在產生的線程不會被調試之前有一個問題,但是這是固定的)。

現在,如果它在不同的進程上啓動,則需要使用遠程調試器(即使它位於同一臺計算機上)。請參閱:http://pydev.org/manual_adv_remote_debugger.html

+0

不幸的是,似乎仍然完全如2.7.3所述。 –

5

CELERYD_POOL默認爲celery.concurrency.prefork:TaskPool這將爲每個worker生成單獨的進程,並且PyDev無法在其中看到它們。如果將其更改爲其中一個線程選項,則可以使用調試器。

例如,對於芹菜3.1,你可以使用此設置:

CELERYD_POOL = 'celery.concurrency.threads:TaskPool' 

注意,這需要安裝的threadpool模塊。

此外請確保有CELERY_ALWAYS_EAGER = False,否則更改池類是沒有意義的。

+0

哇,這看起來很棒! –

0

我創建了一個管理命令測試任務..覺得比從shell中運行它容易..

10

您可以用做芹菜的rdb

from celery.contrib import rdb 
rdb.set_trace() 

然後,在不同的終端類型telnet localhost 6900,你將得到調試提示。

+2

或端口6901 - 請按照芹菜術語中的消息 –

相關問題