2

マルチプロセッシングのネストされたプールに関するこの質問に答える:

https://stackoverflow.com/a/40852258/6522112

私が提案したコードは、私が望んでいた方法で応答しませんでした。つまり、 と の場合ThreadingPool(8)ProcessingPool(3)プロセスの数は 24 になると予想していましたが、3 つしか得られませんでした。そこで、デーモン フラグを False に設定することでネストされたプロセス プールを許可する、このhttps://stackoverflow.com/a/8963618/6522112の使用を続けました。これは完全に機能しますが:

  1. 24 ではなく 3 プロセスしか得られないのは正常でしたか?
  2. このハックで正しくやっていますか?
  3. 最終的な目的は、クラスター上の複数のノードを使用してこれを行うことです。これはそれを防ぎますか?
  4. 考慮すべきのタイプについてはよくわかりませんが、組み合わせ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))
4

0 に答える 0