2
# data is a list  

Threading_list=[]

class myfunction(threading.Thread):

    def __init__(self,val):
        .......
    .......

     def run(self):
        .......
        ....... 

for i in range(100000):

    t=myfunction(data[i]) # need to execute this function on every datapoint 
    t.start()
    Threading_list.append(t)

for t in Threading_list:
    t.join()

これにより約100000のスレッドが作成されますが、最大32のスレッドを作成できますか?このコードでどのような変更を行うことができますか?

4

2 に答える 2

4

非常に多くの Python スレッドを作成する必要はほとんどありません。それどころか、その理由がほとんど想像できません。スレッド数を制限する並列実行コードの作成タスクを解決するための適切なアーキテクチャ パターンがあります。それらの1つはリアクターです。

あなたは何をしようとしているのですか?

そして、 GILのおかげで、Python スレッドは、マルチプロセッサや複数のカーネル システムであっても、計算タスクのパフォーマンスを向上させないことを思い出してください (ちなみに、100000 個のカーネル システムが存在する可能性はありますか? 疑問です :))。ブーストの唯一のチャンスは、GIL を取得せずに作業を行う C/C++ で記述されたモジュール内で計算部分が実行される場合です。通常、Python スレッドは、ブロッキング I/O 操作を含むコードの実行を並列化するために使用されます。

UPD: stackless-python タグに気付きました。私の知る限り、マイクロスレッドをサポートしています。ただし、何をしようとしているのかはまだ不明です。

100000 個の値を処理しようとしている場合 (それぞれに数式を適用する場合)、次のように記述することをお勧めします。

def myfunction(val):
    ....
    return something_calculated_from_val

results = [myfunction(d) for d in data] # you may use "map(myfunction, data)" instead

myfunction()ブロッキング I/O を実行しない限り、はるかに優れているはずです。もしそうなら、ThreadPoolExecutor本当に役立つかもしれません。

于 2013-02-03T07:55:15.550 に答える
0

ThreadPoolExecutorを介して 32 スレッドを使用して、任意の長さのリストの 2 乗を計算する例を次に示します。Ellioh が言ったように、場合によってはスレッドを使用したくない場合があるため、ProcessPoolExecutorに簡単に切り替えることができます。

import concurrent.futures

def my_function(x):
    return 2**x

data = [1, 6, 9, 3, 8, 4, 213, 534]

with concurrent.futures.ThreadPoolExecutor(max_workers=32) as executor:
    result = list(executor.map(my_function, data))

print(result)
于 2013-02-03T08:04:22.997 に答える