2016-09-17 54 views
0

我有這樣的場景:的Python開始從doulbe所有線程LOOP

threads = [] 
for wordToScan in wordsList: 
    dictionaryFileOpen = open(dictionaryFile, "r") 

    for i in range(10): 
     threads.append(Thread(target=words_Scan_Start, args=(dictionaryFileOpen, wordToScan))) 

for thread in threads: 
    thread.start() 
for thread in threads: 
    thread.join() 

def words_Scan_Start(dictionaryFile, wordToScan): 
    while True: 
     sub_word = dictionaryFile.readline() 
     if not sub_word: 
      break 
     #... Here is some actions. 

現在我需要一次啓動所有這些線程(每10個線程,每wordToScan in wordsList)。

wordToScan in wordsList:應在10個線程,但沒有移動.readline()爲其他wordToScan in wordsList:,在同時工作使用dictionaryFileOpen。另外,我不明白在哪裏關閉dictionaryFileOpen

回答

0

這裏是我已經完成它:

threads = [] 
for wordToScan in wordsList: 
    wordThread = [] 
    dictionaryFileOpen = open(dictionaryFile, "r") 

    for i in range(10): 
     wordThread.append(Thread(target=words_Scan_Start, args=(dictionaryFileOpen, wordToScan))) 
    threads.append(wordThread) 

for thread in threads: 
    for wordThread in thread: 
     wordThread.start() 
for thread in threads: 
    for wordThread in thread: 
     wordThread.join() 
    dictionaryFileOpen.close() 

def words_Scan_Start(dictionaryFile, wordToScan): 
    while True: 
     sub_word = dictionaryFile.readline() 
     if not sub_word: 
      break 
     #... Here is some actions. 

我這樣做對嗎?

0

您不應該從多個線程讀取文件。這涉及以下注意事項:

  1. 從多個線程訪問的對象必須是線程安全的。文件不是線程安全的。所以你必須保護你所有使用互斥鎖的地方。
  2. 從磁盤讀取是一個相當緩慢的過程。單個線程可以很好地處理它。
  3. 線性讀取比隨機讀取快得多。所以從單個線程讀取它是有效的。

所以一般的方法是從一個線程讀取文件,然後爲其他線程分派處理分支。如果你可以在一個線程中完成工作,那麼最好這樣做,因爲它更簡單。只有在真正需要它們時,纔可以製作多線程應用程序。

+0

是的,我明白這一點,我使用鎖()的線程的地方觸摸「線程安全的」共享資源。但是我使用文件的原因只是因爲'.readline()'。每當某個線程正在使用它時('.readline()'可以做到這一點),我不知道如何通過將光標指向下一行來迭代行。或者如何讓每個線程只使用列表中的「下一個未使用」項目。 – passwd

+1

使工作線程從隊列中取出線(https://docs.python.org/2/library/queue.html)並處理它們。然後讓一個讀取器線程讀取行並將它們推入隊列中。 –

+0

Thanx。隊列在wordList:'中用一個'wordToScan進行線程計算。但是,當我嘗試在使用常用隊列的單獨線程中啓動幾個'wordToScan in wordsList:'時,它並沒有幫助。你能用我注意到的代碼展示一個例子嗎? – passwd