タスクが複数のスレッドに分割されていることを示す明確な例が欲しいです。
ベストアンサー1
この質問が2010年に出されたときから、Pythonで単純なマルチスレッドを実行する方法が本当に簡素化されてきました。地図そしてプール。
以下のコードは、ぜひチェックすべき記事/ブログ投稿からの抜粋です(提携関係はありません) -1 行の並列処理: 日常のスレッド タスクに適したモデル以下に要約します。結局、数行のコードになります。
from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(4)
results = pool.map(my_function, my_array)
次のマルチスレッド バージョンは次のようになります。
results = []
for item in my_array:
results.append(my_function(item))
説明
Map は、Python コードに並列処理を簡単に導入するための鍵となる、便利な関数です。ご存じない方のために説明すると、map は Lisp などの関数型言語から派生したものです。これは、シーケンスに別の関数をマップする関数です。
Map はシーケンスの反復処理を処理し、関数を適用し、最後にすべての結果を便利なリストに保存します。
実装
map 関数の並列バージョンは、2 つのライブラリ (multiprocessing と、あまり知られていないが同様に優れたその継子である multiprocessing.dummy) によって提供されます。
multiprocessing.dummy
マルチプロセッシングモジュールと全く同じです。代わりにスレッドを使用する(重要な区別- CPU を集中的に使用するタスクには複数のプロセスを使用し、I/O にはスレッドを使用します (I/O 中も同様)。
multiprocessing.dummy は multiprocessing の API を複製しますが、スレッド モジュールのラッパーにすぎません。
import urllib2
from multiprocessing.dummy import Pool as ThreadPool
urls = [
'http://www.python.org',
'http://www.python.org/about/',
'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html',
'http://www.python.org/doc/',
'http://www.python.org/download/',
'http://www.python.org/getit/',
'http://www.python.org/community/',
'https://wiki.python.org/moin/',
]
# Make the Pool of workers
pool = ThreadPool(4)
# Open the URLs in their own threads
# and return the results
results = pool.map(urllib2.urlopen, urls)
# Close the pool and wait for the work to finish
pool.close()
pool.join()
そしてタイミングの結果は次のようになります。
Single thread: 14.4 seconds
4 Pool: 3.1 seconds
8 Pool: 1.4 seconds
13 Pool: 1.3 seconds
複数の引数を渡す(次のように動作します)Python 3.3以降のみ):
複数の配列を渡すには:
results = pool.starmap(function, zip(list_a, list_b))
または、定数と配列を渡すには:
results = pool.starmap(function, zip(itertools.repeat(constant), list_a))
以前のバージョンのPythonを使用している場合は、複数の引数を渡すこともできます。この回避策)。
(感謝ユーザー136036役に立つコメントをありがとうございます。