map()
と一緒に使用した場合、multiprocessing
ライブラリにはかなり新しく、Pool
モジュールに関する質問があります。私は4つのワーカースレッドと6つのタスクが完了すると仮定します。私は私がPool.map()は、タスクを処理する方法を理解したいpool.map()は内部的にワークをどのように割り当てますか?
from multiprocessing.dummy import Pool as ThreadPool
def print_it(num):
print num
def multi_threaded():
tasks = [1, 2, 3, 4, 5, 6]
pool = ThreadPool(4)
r = pool.map(print_it, tasks)
pool.close()
pool.join()
multi_threaded()
(私はスレッドではなくプロセスを起動したいのでmultiprocessing.dummy
を使用して)されていますか? 3つのオプション:
- 最初に4つのスレッドを生成し、最初の4つのタスクを完了してスレッドを終了させますか?その後、残りのタスクのために2つの新しいスレッドを生成しますか?
- いくつかのスレッドがタスクを完了するとすぐに4スレッドを割り当て、4スレッドを割り当てます。同じスレッドに新しいタスクを割り当てます。
- 他の方法です。
この洞察は、Pool.map()
をより効果的に使用することを考えるのに役立ちます。
私が知っているプールはすべて実際には(2)です。しかし、私はこの特定のライブラリを知らないし、一般的に私は主にPython +マルチスレッドの経験が残念ながらある。私はいくつかの限られたスマートな解決策はかなり可能だと思います。詳細な解答は幸運です。 – peterh
'print_it'関数を' sleep'とすることで何が起こるかを調べるためのテストを行うことができます。そして、Python 3.6でこのテストを行うと、それを処理する余分なスレッドがあるとすぐに新しいタスクが始まるように見えます。 – quamrana
なぜ[ソースを読む](https://github.com/python/cpython/blob/5e02c7826f9797fb3add79b608ef51f7a62b3e5a/Lib/multiprocessing/pool.py#L146)、自分で見てみませんか? 'ThreadPool'クラスは通常の' multiprocessing.pool.Pool'のサブクラスで、いくつかのものをオーバーライドします(望むなら、ファイルの最後に定義があります)。 – Blckknght