マルチプロセッシングのネストされたプールに関するこの質問に答える:
https://stackoverflow.com/a/40852258/6522112
私が提案したコードは、私が望んでいた方法で応答しませんでした。つまり、 と の場合ThreadingPool(8)
、ProcessingPool(3)
プロセスの数は 24 になると予想していましたが、3 つしか得られませんでした。そこで、デーモン フラグを False に設定することでネストされたプロセス プールを許可する、このhttps://stackoverflow.com/a/8963618/6522112の使用を続けました。これは完全に機能しますが:
- 24 ではなく 3 プロセスしか得られないのは正常でしたか?
- このハックで正しくやっていますか?
- 最終的な目的は、クラスター上の複数のノードを使用してこれを行うことです。これはそれを防ぎますか?
- 考慮すべきのタイプについてはよくわかりませんが、組み合わせ
map
だけが機能しているようです。imap
洞察はありますか?
pathos
単純なマルチプロセッシングの代わりに @MikeMcKernsを使用する変更されたコードを次に示します。
import pathos
import multiprocess
class NoDaemonProcess(multiprocess.Process):
"""NoDaemonProcess class.
Inherit from :class:`multiprocessing.Process`.
``daemon`` attribute always returns False.
"""
def _get_daemon(self):
return False
def _set_daemon(self, value):
pass
daemon = property(_get_daemon, _set_daemon)
class NestedPool(pathos.multiprocessing.Pool):
"""NestedPool class.
Inherit from :class:`pathos.multiprocessing.Pool`.
Enable nested process pool.
"""
Process = NoDaemonProcess
これを使用する場合は注意が必要です。内側のプールを終了する必要があります。そうしないと、ゾンビになってしまいます。
import NestedPool
def triple(x):
return 3*x
def refork(x):
pool = NestedPool(3)
result = pool.imap(triple, range(5))
result = list(result)
pool.terminate()
return result
pool = NestedPool(8)
result = pool.imap(refork, range(3))