2013-02-15 107 views
3

我遇到了Python多處理包的問題。下面是一個簡單的示例代碼,說明我的問題。Python多處理,ValueError:關閉的文件上的I/O操作

import multiprocessing as mp 
import time 

def test_file(f): 
    f.write("Testing...\n") 
    print f.name 
    return None 

if __name__ == "__main__": 
    f = open("test.txt", 'w') 
    proc = mp.Process(target=test_file, args=[f]) 
    proc.start() 
    proc.join() 

當我運行這個,我得到以下錯誤。

Process Process-1: 
Traceback (most recent call last): 
    File "C:\Python27\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "C:\Python27\lib\multiprocessing\process.py", line 114, in run 
    self.target(*self._args, **self._kwargs) 
    File "C:\Users\Ray\Google Drive\Programming\Python\tests\follow_test.py", line 24, in test_file 
    f.write("Testing...\n") 
ValueError: I/O operation on closed file 
Press any key to continue . . . 

似乎在創建新進程的過程中文件句柄「失去」了。有人可以解釋發生了什麼事嗎?

+4

如果你點擊左上角的Console圖標,你會發現菜單選項來選擇和複製文本。 *請*使用該功能將traceback *作爲文本*複製到您的帖子中。 – 2013-02-15 16:46:59

+1

http://stackoverflow.com/questions/1075443/multiprocessing-share-objects-with-file-handle-attribute-between-processes ...你可能想把你的輸出轉儲到一個隊列中,當你所有的進程都是完成後,將輸出從隊列中彈出並通過主進程寫出來 – pyInTheSky 2013-02-15 17:04:15

回答

7

我在過去曾遇到過類似的問題。不知道它是在多處理模塊內部完成的,還是默認情況下open設置了close-on-exec標誌,但我確信主進程中打開的文件句柄是在多處理子項中關閉的

顯而易見的解決方法是將文件名作爲參數傳遞給子進程的init函數,並在每個子進程中打開一次(如果使用池),或者將其作爲參數傳遞給目標函數並打開/關閉每個調用。前者需要使用全局來存儲文件句柄(不是一件好事) - 除非有人能告訴我如何避免這種情況:)而後者可能會導致性能下降(但可用於多處理。直接進程)。前者的

例子:

filehandle = None 

def child_init(filename): 
    global filehandle 
    filehandle = open(filename,...) 
    ../.. 

def child_target(args): 
    ../.. 

if __name__ == '__main__': 
    # some code which defines filename 
    proc = multiprocessing.Pool(processes=1,initializer=child_init,initargs=[filename]) 
    proc.apply(child_target,args) 
+0

謝謝isedev!我希望其他對象不會出現類似的問題。你知道嗎? – Ray 2013-02-15 17:21:13

+0

不是我所知道的。 – isedev 2013-02-15 17:22:50

相關問題