2016-04-29 10 views
3

私はPythonでスレッディングを行いたいです。私は100単語あり、6つの異なるリンクにそれらを入れたい。リンクの1つが準備が整っていれば、リンクが新しい単語を得ることができます。これは他のスレッドがまだ作業中の最初の単語を持っている間、これ。私の完全なプログラムは、100個のキーワードが完了したときに、より多くのコードを最初に実行できるようにする必要があります。私は、現時点ではエラーが出るPython:スレッドは一度しか起動できません。

threads = [] 

def getresults(seed): 
    for link in links: 
     t = threading.Thread(target=getLinkResult, args = (suggestengine, seed)) 
     threads.append(t) 
    for thread in threads: 
     thread.start() 

for seed in tqdm: 
    getresults(seed + a) 
    getresults(seed + b) 

for thread in threads: 
    thread.join() 

#code that should happen after 

: スレッドが一度だけ

+0

で唯一の新しいスレッドがこのコードを使用してエラー –

+0

@Kasramvdを投稿してください始めるべきである私は、エラーすべてようにどのように私は私のコードを変更することができます「スレッドが一度だけ起動することができます」取得します作品ですか? – Sonius

+0

@GilbertAllen RuntimeError:スレッドは一度しか起動できません – Sonius

答えて

7

あなたが二回getresultsを呼び出している開始することができ、かつ両方の時間が、彼らは同じグローバルthreadsリストを参照する私は、次のコードを持っています。つまり、getresultsを初めて呼び出すと、スレッドが開始されます。

2回目にそれらを呼び出すと、既に実行中の以前のスレッドに.start()メソッドが再び呼び出されます。

ローカルスレッドとしてgetresultsのスレッドを開始してから、それらをグローバルthreadsリストに追加する必要があります。

次の操作を行うことができますが:

for thread in threads: 
    if not thread.is_alive(): 
     thread.start() 

1つ以上のスレッドが既に終了してきたかもしれないので、再び開始されるので、同じエラーを引き起こすとして、それは問題を解決していません。

+0

すべてのスレッドのthread.joinが結果を得た後にコードを変更した場合、同じエラーが発生します – Sonius

+0

@Sonius私の提案を試してみてください。おそらくそうだろう。 –

+0

作品、ありがとう:) – Sonius

0

エラーは明示的です。スレッドを2回起動しますが、そうしないでください。

getresults(seed + a) 
getresults(seed + b) 

これらの呼び出しを並べ替えると、スレッドのループが2回開始されます。あなたがしたいことを正しく行うには、thread pool and a task queueを作成してください。基本的には、処理する単語のリストとミューテックスが必要です。各スレッドはmutexをロックし、単語の読み書きを解除し、その単語のロックを解除して処理します。

+0

あなたの答えは良いですが、それはユーザーの目的をサーバー化していません。ユーザーはバッチでスレッドを呼び出したい、つまり同じスレッドを再び開始する必要があります。 –

1

あなたのgetresults

threads = [] 

def getresults(seed): 
    local_threads = [] 
    for link in links: 
     t = threading.Thread(target=getLinkResult, args = (suggestengine, seed)) 
     local_threads.append(t) 
     threads.append(t) 
    for thread in local_threads: 
     thread.start() 

for seed in tqdm: 
    getresults(seed + a) 
    getresults(seed + b) 

for thread in threads: 
     thread.join() 
+0

これも良いことです。 –

+0

これは私が最初に持っていたものです。しかし、その後、私は5つのスレッドで1つの単語を行うことができます。 5つのスレッドすべてが準備できているなら、私は次の言葉をすることができます。しかし、Games Brainicのソリューションでは、第3ワードはスレッド1に、スレッド2はワード1で動作します。 – Sonius

関連する問題