2017-12-12 19 views
0

複数のスレッドを使用して乱数を生成するこのサンプルコードを作成しました。Python:スレッド関数からの戻り値の収集

各乱数を問題なく印刷できます。しかし、私が達成しようとしているのは、返されたすべての整数をgenerated_numbers配列に集めたいということです。

from random import randint 
from threading import Thread 
import time 


def generate_random_number(n): 
    time.sleep(randint(0, 99)*0.01) 
    random_number = randint(0, 99) 
    print(str(n) + 'th random number: ' + str(random_number)) 
    return random_number 


generated_numbers = [] 

for i in range(1, 100): 
    thread = Thread(target=generate_random_number, args=(i,)) 
    thread.start() 

答えて

2

私はあなたが反復可能range(1,100)に機能generate_random_numberをマッピングすることができPoolクラスで、代わりにthreadingmultiprocessingを使用してお勧めします。ここで

は何をしたいんです例:

N.B. 100スレッドは、そのような小さな繰り返しのために少し残酷です。

import multiprocessing 
from random import randint 


def generate_random_number(n): 
    random_number = randint(0, 99) 
    return f'{n}th random number: {random_number}' 


if __name__ == '__main__': 
    pool = multiprocessing.Pool(100) 
    generated_numbers = pool.map(generate_random_number, range(100)) 
    print(generated_numbers) 
+0

これが助けになりました!ありがとう:)もちろん、それは過度のものです、これは質問のためだけに使用されるダミーコードでした。 – nipunasudha

0

from random import randint 
from threading import Thread 
import time 


def generate_random_number(n): 
    global generated_numbers 
    time.sleep(randint(0, 99)*0.01) 
    random_number = randint(0, 99) 
    print(str(n) + 'th random number: ' + str(random_number)) 
    generated_numbers.append(random_number) 
    return random_number 


generated_numbers = [] 

threads = [Thread(target=generate_random_number, args=(i,)) for i in range(100)] 
for thread in threads: 
    thread.start() 

[t.join() for t in threads] 
print generated_numbers 

t.join()を実行するスレッドを待ちます、我々はthread.joinとして、リストの内包表記を使用してこれをやっているが、()を1回、最後のスレッドが持って解決するだろうような何かを行いますすべての開始スレッドが実行される前に発生する可能性があります。

+0

私はこの解決策についてはあまりよく分かりません。安全な複数のスレッドからグローバルリストを変更していますか? – nipunasudha

+0

正直なところ、安全であるかどうかわからない、代替機能はマルチヘッドでキューを使用しています@nipunasudha –

+0

それは別のことだと思います。 CPythonでは一度に1つのスレッドしか実行しないグローバルインタプリタロック(GIL)のため安全です。コードを並列に実行できる複数のプロセスを使用している場合は、当然ではありません。 – afc11hn