2013-10-13 27 views
0

我有一個隊列工作delagator是通過自定義multiprocessing.Pool()產卵15-25子進程。單個工作人員在10-15條消息中發出1-3條logging.info消息,時間少於1000毫秒,我注意到時間戳總是順序的,並且永遠不會與其他消息相沖突。這表明我在多處理或日誌記錄中存在一個共享鎖,但我無法弄清楚它究竟在哪裏。在Linux上使用Python 2.7 multiprocessing.Process和日誌記錄,如何/爲什麼要記錄順序?

這主要是爲了教育目的而提出的,因爲相關軟件將被重構爲異步或多線程,因爲90%的實時時間在IO(遠程API而不是數字處理)。

日誌記錄配置反映Django的,我喜歡怎麼說是有組織:

LOGGING['handlers']['complex_console'] = {'level':'DEBUG', 
    'class':'logging.StreamHandler',   
    'formatter':'complex' 
} 

LOGGING['loggers']['REDACTED_sync'] = { 
'handlers': ['complex_console'], 
'propagate': True, 
'level':'DEBUG' 
} 

一些快速澄清,multiprocessing.Process確實使用叉子,但調用logging.getLogger()不發,直到子進程後,產生。

+0

雖然我不認爲這是關係到記錄器,我使用多記錄了無數次,始終使用相同的記錄,我也從一個互相交織不同的進程接收消息。您可以嘗試使用單個記錄器實例(可能有幫助,也可能不幫助),或者發佈產卵代碼以獲得更好的外觀。 – micromoses

回答

1

我不知道你是如何產卵的作品,但如果它遵循一個非常簡單的模式:

logger = get_logger() # Gets logger instance) 

class Foo: 
    #Definition 

while(True): 
    #A loop that spawns processes 

然後,他們將分享記錄的同一個實例,因此,爲什麼你「連續」寫道。它不強制任何鎖定,你會發現性能明智。這是一個非常簡單的原因 - 追加到日誌文件是非常快的,並且幾乎總是在這個文件被再次需要之前完成。

,您可根據實驗和記錄刪除文件處理程序,你會發現,他們仍然順序,因爲它是非常罕見的兩個過程,即使做同樣的,在同一時間完成。

+0

調試/信息發出打算從5到10條信息,在任何地方標準輸出的500毫秒內約4小時,但我還沒有看到,即使一條線路獲得錯位。日誌配置是在fork之前完成的,但大部分getLoger調用都是在POpen fork之後。 – David

+0

我不認爲我明白你的實際問題是什麼,時間戳是順序的?如果是,那麼它是按照預期工作的,我不明白爲什麼你期望它不是?記錄中顯示的時間戳記是一個時間戳記logging.info()調用,它也會鎖定日誌文件並寫入它。這是如何實現的,這就是爲什麼時間戳是連續的。 –

+0

我所關心的是'logging.StreamHandler'在某種程度上保持了所有分叉的子進程調用,這表明在某處有一個鎖。我已經把\ B和。\ E字符格式,看看要麼是上線超過一次或丟失,沒有運氣的週期是輸出20K日誌條目通過'蟒蛇my_program.py標準輸出| tee log_file.py' – David

0

如果你只有一個處理器,那麼應​​該可以預期,你的行爲。

+0

對不起,重新檢查並且所討論的機器至少有4個邏輯核心,儘管它是AWS,所以可能沒有多大意義。實例類型具體爲m1.xlarge。 – David

+0

這與處理器數量甚至線程無關,因爲即使在1個邏輯線程中也可以進行多處理。向下投票。 –

+0

OP聲稱使用多處理,而不是線程。你是對的,你可以在處理器上運行多個線程。但是,一次只能在單個處理器系統上處理一個進程。因此,合理預期日誌不會重疊。 –