2012-04-24 125 views
2

我正在嘗試升級在Windows上運行可執行文件的python腳本,並將文本輸出文件管理爲使用多個線程進程的版本,以便我可以使用多個內核。我有四個獨立版本的可執行文件,每個線程都知道要訪問它。這部分工作正常。我遇到問題的地方在於它們同時運行,並嘗試打開(不同的)輸出文件以確保它們正確運行並根據輸出文件的內容做出反應。用於運行可執行文件的python多線程進程

具體來說,運行三個線程,二時將出現以下錯誤崩潰,而一個繼續工作:

Exception in thread Thread-4: 
Traceback (most recent call last): 
    File "C:\Python27\lib\threading.py", line 552, in __bootstrap_inner 
    self.run() 
    File "E:\HDA\HDA-1.0.1\Hm-1.0.1.py", line 782, in run 
    conf = self.conf_file(Run) 
    File "E:\HDA\HDA-1.0.1\Hm-1.0.1.py", line 729, in conf_file 
    l = open(self.run_dir(Run)+Run, 'r').readlines()  #list of file lines 
IOError: [Errno 2] No such file or directory: 'Path/to/Outputfile' 

這導致從線程不能正確運行可執行文件(即爲什麼「路徑/到/輸出文件'沒有被創建,因此無法找到)。但其中一個線程正確地做到了這一點,而另外兩個線程卻做不到。是否有一個原因,我無法獲得運行不同版本可執行文件的多個線程?

+3

使用線程我會問題有兩個,「我知道」,我認爲 – 2012-04-24 21:31:54

+1

一個典型的問題是在某處調用os.chdir(),因爲當前工作目錄是一個進程寬屬性。 – schlenk 2012-04-25 06:06:37

回答

2

我不認爲GIL本身不會殺死它本身,除非打開文件讓你陷入一些奇怪的死鎖或螺旋鎖狀態。 一般來說,你需要線程在這種情況下,你是I/O綁定。事實上,線程能夠併發運行的事實可能會導致其他線程失敗,而不是成功地多次打開文件。

On slide fifteen of this presentation,作者指出,GIL發佈了阻止I/O調用以給其他線程一個機會。

這裏真正的問題似乎是對文件資源的鎖定。我並不確定Windows的工作原理,所以我不能說爲什麼這個錯誤正在蔓延,但似乎只有一個線程實際上鎖定了文件資源。

關於多核心和GIL的另一張海報的觀點可能會發揮作用,因爲在其他兩個線程正在捱餓的情況下,您可能會進行某種優先級倒置,但是我發現不可能考慮到上述情況演示文稿說阻塞操作中的線程釋放其他線程的鎖。一個想法是嘗試multiprocessing。我懷疑你在跨多個進程而不是使用線程讀取文件方面會有更好的運氣。

這是我寫的,想我的OS 10.7.3機器上的例子,它開闢了一個文件test,其內容lol\n

import multiprocessing 
import os 

def open_file(x): 
    with open(x, 'r') as file_obj: 
    return file_obj.readlines() 

a = multiprocessing.Pool(4) 
print a.map(open_file, ['test']*4) 

這裏的結果,當我執行它:

➜ ~ git:(master) ✗ python open_test.py 
[['lol\n'], ['lol\n'], ['lol\n'], ['lol\n']] 
1

由於Global Interpreter Lock,Python目前無法利用多個內核。多線程往往充滿了麻煩,無論如何 - 如果可以的話,最好使用多個進程。

相關問題