2017-11-08 13 views
0

Pythonのスレッドを使用してリストから関数に引数を渡そうとしています (注:関数の値をハードコードしてはならず、リストが渡されます) ここでのサンプルコードを見てください:。Pythonのスレッドを使用してリストから関数に引数を渡す

from threading import Thread 
list=['john','doe','srav','dev','app'] 
def m1(name,prefix): 
    for ele in range(2): 
     print(name +prefix) 

def main1(): 
    t1=Thread(target=m1,args=('abcd','john')) 
    t2 = Thread(target=m1, args=('abcd', 'doe')) 
    t1.start() 
    t2.start() 

if __name__ == '__main__': 
    main1() 

ここに私のリストから、代わりにそのパスの機能にハードコードされた値(「ジョン」、「DOE」)とすべての要素が渡されます。

+0

実行者が必要なようです。この関数を別のスレッドの各リスト要素にマップすることができます。 –

+0

Mad、それを行うためのサンプルコードを提供できますか?私はPythonの初心者です – user8904897

+0

少しでも何かします –

答えて

1

あなたが達成しようとしていることを完全に理解しているかどうかはわかりません。私の理解では、リスト内の各値に対して別のスレッドを開始したいので、各値は「並行して」処理されます。私はそうするためにあなたのmain1機能を変更:

def main1(): 
    threads = [Thread(target=m1,args=('abcd',x)) for x in list] 
    for thread in threads: thread.start() 
    for thread in threads: thread.join() 

threads = [Thread(target=m1,args=('abcd',x)) for x in list]は、リスト内の各値のために別のスレッドを作成します。

for thread in threads: thread.start()各スレッドを開始します。

for thread in threads: thread.join()は、各スレッドがmain1関数から戻る前に終了していることを確認します(すぐに復帰する場合は、この行を削除してください)。

0

あなたのタスクはconcurrent.futuresモジュールでの使用に適しています。特に、Executor.mapは、反復可能な要素に関数を適用します。

あなたはdocsThreadPoolExecutor例に似たものを使用することができます。

from concurrent.futures import ThreadPoolExecutor 
from itertools import repeat 

names = ['john', 'doe', 'srav', 'dev', 'app'] 
def m1(name, prefix): 
    for _ in range(2): 
     print(name + prefix) 

with ThreadPoolExecutor(2) as executor: 
    executor.map(m1, repeat('abcd', len(names)), names) 

あなたは厄介なことrepeat構文を見つけた場合、あなたは選択肢のカップルを持っている:

with ThreadPoolExecutor(2) as executor: 
    for name in names: 
     executor.submit(m1, 'abcd', name) 

OR

with ThreadPoolExecutor(2) as executor: 
    executor.map(lambda name: m1('abcd', name), names) 

ブロックwithブロックは暗黙的にexecutor.shutdownを呼び出し、すべてのタスクが完了するのを待ちます。

通常、変数listを呼び出しないでください:組み込みクラスの名前がシャドーされます。

関連する問題