2013-01-25 34 views
4

我想用芹菜輸出到多個文件。任務很簡單:使用芹菜輸出到文件

  • 得到一些數據與文件路徑
  • 追加沿着數據文件路徑(和創建文件,如果不存在的話)

我做不想每次都打開/關閉文件句柄,因爲在很多情況下我會寫入相同的文件。所以我做了一個簡單的FileHandlePool。

但是,運行時我注意到,對於每個線程/實例,芹菜將創建一個新的FileHandlePool!所以,我有被覆蓋的文件。

處理這種情況的最佳方法是什麼?是否有可能使m FileHandlePool與主線程處於相同的範圍,並讓其他芹菜線程訪問它?

謝謝!

+0

您是以線程模式運行Celery還是作爲單獨的進程運行? –

+0

我覺得線程化模式。我正在使用Celery教程中的基本設置 – chaimp

+0

Celery默認使用工作池中的單獨進程。您可以使用CELERYD_POOL配置參數來擴充它。 –

回答

3

該池似乎不被芹菜線程共享。理想的做法是將單個進程分配給文件,並且所有芹菜線程都應該通過隊列寫入該進​​程。

+0

這正是我想要做的。我想我在問題中沒有很好地描述它。所以......我該怎麼做? – chaimp

+2

我一直引用教程http://www.ibm.com/developerworks/aix/library/au-threadingpython/ – djinn

1

如果我不希望將一個單獨的服務(在Celery之外)同步到文件,那麼我在Celery中完成此任務的方式是將一個工作池(具有併發1的池)綁定到特定隊列只接受文件寫入任務。這種方式連續運行,寫作時不會出現任何競爭條件。

或者,如您最初所建議的那樣,您可以將CELERYD_POOL模式更改爲使用線程,然後將文件句柄引用存儲在任務實例中,以便您可以從不同的工作線程訪問它。我假設文件句柄是線程安全的。

+0

您能舉一個簡短的例子來說明將CELERYD_POOL改爲什麼嗎? – chaimp