2016-10-06 112 views
0
import threading 


def read_file(): 
    f = open('text.txt') 
    for line in f: 
     print line.strip() ,' : ', threading.current_thread().getName() 

if __name__ == '__main__': 
    threads = [] 
    for i in range(15): 
    t = threading.Thread(target=read_file) 
    threads.append(t) 
    t.start() 

問題:每個線程會從上面的文件中只讀取一行還是有可能給定的線程最終讀取一行兩次?多線程文件讀取python

我的理解是稍後啓動的線程將覆蓋早期啓動的線程的文件句柄,導致較早的線程最終讀取幾行兩次或三次或更多次。

當我運行此代碼時,結果與預期發生的結果不同。

歡迎任何解釋。

+1

運行該程序的結果是什麼?你有沒有注意到有惡魔從你的鼻子裏飛出來? :) –

回答

7

每個線程獨立運行你的功能;該函數的每個副本都以本地方式打開該文件,而不是共享的。每個Python文件對象完全獨立地跟蹤讀取狀態;每個在這裏都有自己的操作系統級文件句柄。

所以,不,如果沒有其他改變文件內容,每個線程會看到每行只有一次,只是一樣的,如果單獨過程試圖讀取該文件。

+0

但是爲什麼每個線程獨立運行該功能?這是傳遞給每個線程的相同函數對象。那麼每個線程如何才能以本地方式打開文件呢? – abc

+3

@abc:是的,你傳遞一個函數*對象*。所以一個線程被啓動,*在該線程上*該函數實際上被稱爲*。當一個函數被調用時,它會創建一個具有自己的本地結構的新框架。每個線程分別調用函數,每個線程獲取自己的功能框架,每個功能框架都有本地人。那些當地人是完全獨立的。 –