Python从doulbe FOR LOOP开始所有线程

时间:2016-09-17 11:26:21

标签: python multithreading readline

我有这种情况:

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.

现在我需要立即启动所有这些线程(每个wordToScan in wordsList分别有10个线程。)

每个wordToScan in wordsList:应该在10个主题中使用dictionaryFileOpen,但不会为同时工作的其他.readline()移动wordToScan in wordsList:。另外,我无法理解关闭dictionaryFileOpen的位置。

2 个答案:

答案 0 :(得分: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.

我做得对吗?

答案 1 :(得分:0)

您不应该从多个线程中读取文件。这涉及以下注意事项:

  1. 从多个线程访问的对象必须是线程安全的。文件不是线程安全的。因此,您必须使用互斥锁保护所有使用它的地方。
  2. 从磁盘读取是一个非常缓慢的过程。单个线程可以很好地处理它。
  3. 线性读取比随机读取快得多。因此,从单个线程中读取它是有效的。
  4. 因此,一般方法是从一个线程读取文件,然后为其他线程调度处理分支。如果你能在一个线程中完成工作,最好这样做,因为它更简单。只有在你真正需要时才能创建多线程应用程序。