2016-09-17 4 views
0

FOR doulbeからすべてのスレッド私はシナリオのこの種を持っているが、開始します。PythonはLOOP

すべてwordToScan in wordsList: 10個のスレッドではなく、同時に働いていることを他のwordToScan in wordsList:ため.readline()を移動せずに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. オブジェクトは、スレッドセーフである必要があります。これは、考慮事項を以下が含まれます。ファイルはスレッドセーフではありません。だからあなたはmutexでそれを使う場所をすべて守る必要があります。
  2. ディスクからの読み取りは、かなり遅い処理です。 1つのスレッドで大きなマージンで処理できます。
  3. リニア読み取りは、ランダム読み取りよりもはるかに高速です。したがって、それを単一のスレッドから読み取ることは効果的です。

一般的なアプローチは、あるスレッドからファイルを読み込み、他のスレッドの処理フォークをディスパッチすることです。そして、あなたが1つのスレッドで作業を行うことができれば、はるかに簡単であるので、それを行うだけです。マルチスレッドアプリケーションは、本当に必要なときにのみ作成してください。

+0

はい、私はこれを理解しており、スレッドが「スレッドが安全でない」共有リソースに触れる場所であればLock()を使用しています。しかし、私がファイルを使用しているのは '.readline()'のためだけです。あるスレッドがそれを使用するたびに、次の行にカーソルを置いて行を繰り返す方法がわかりません( '.readline()')。または、すべてのスレッドがリスト内の「次の未使用」アイテムのみを使用するようにする方法。 – passwd

+1

キュー(https://docs.python.org/2/library/queue.html)から行を取り出して処理するワーカースレッドを作成します。次に、行を読み込んでそれをキューにプッシュする1つのリーダースレッドを作成します。 –

+0

Thanx。スレッドは 'wordToScan in wordsList:'を使ってキューを処理しました。しかし、一般的なQueueを使用している分離されたスレッドでは、単語リストの中で 'wordToScan in few words:'を開始しようとしたときには役に立たなかった。あなたが気付いたコードで例を見せてもらえますか? – passwd