2016-09-17 31 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