2013-12-09 164 views
0

我正在使用Multiprocessing.Queue在我的處理進程和守護進程之間進行通信。守護進程從隊列中獲取輸出並以無限循環寫入文件。文件對象在守護進程printToFile本身中打開。python守護進程,不寫入文件

resultqueue = Queue() 
p = Process(target = printToFile , args=(resultqueue)) 
p.daemon = True 
p.start() 


for si, ei in ranges: 
    pr = Process(target = processing , args=(si, ei, resultqueue)) 
    pr.start() 
    processes.append(pr) 

for pr in processes: 
    pr.join() 

我的問題是printToFile不寫什麼文件,即使它打印到屏幕時,它從隊列中獲得的輸出。當我刪除該行,將其設置爲守護進程,並使用Ctrl + C手動終止該程序時,一切正常。有人能幫我理解發生了什麼嗎?我不知道從哪裏開始調試。

我沒有使用fileObject.close(),因爲守護程序在程序執行完成後死亡。但我不認爲這是問題,因爲當我使用Ctrl + C而沒有創建進程守護進程時,程序會寫入文件。 另一個(也許是不相關的)問題是,當文件對象沒有在printToFile中實例化,但是是全局的,即使使用Ctrl + C也不會將輸出打印到文件。但我可以忍受這一點。但我仍然想知道發生了什麼。

+1

試着用'0'打開文件作爲'open'功能的第三個參數 – Deck

+0

你能給我們一個完整的,可運行的例子嗎?請參閱[SSCCE](http://sscce.org)獲取指導。事實上,它看起來像是要求我們在一個你沒有向我們展示代碼的函數中調試代碼。 – abarnert

+0

謝謝@Deck,就是這樣,不敢相信我對此不知道。 – rohanag

回答

3

由於我的猜測在評論中取得了成功,我會指出我所說的。 open()函數的第三個參數 - buffering

可選緩衝參數指定文件的所需的緩衝區 大小:0表示無緩衝,1表示行緩衝,任何其它正 值意味着使用的(大約)的緩衝區大小(以字節爲單位)。 A 負緩衝意味着使用系統默認值,通常爲 行爲tty設備緩衝,併爲其他文件完全緩衝。如果省略,則使用系統默認值

作爲第三個參數傳遞0作爲第三個參數,您在非緩衝模式下打開文件,所以更改立即出現在那裏。