1

logging.logger などの重要なオブジェクトをピクルするときの頭痛の種を取り除くために、pathos.multiprocessing を使い始めました。ただし、新しいスレッドでインポートが利用できないという問題が発生しています。その結果、その新しいスレッドでそれらのモジュールを「再インポート」する必要があります。具体的には、このケースは次のエラーのために実行されません。

NameError: global name 'os' is not defined

e Found at: multiprocess.pool

result = True, func(*args, **kwds)

次のコードは、組み込みの multiprocessing モジュールの下では機能しますが、機能しません。

import os
import multiprocessing
from pathos.multiprocessing import ProcessPool

class SomethingDoer:
    '''Probably does some thing'''
    def doAllSomethings(self, allSomethings):
        cores = multiprocessing.cpu_count()-1
        pool = ProcessPool(nodes=cores)
        for something in allSomethings:
            someProcess = self.doSomething, something
            pool.apipe(*someProcess)

    def doSomething(self,something):
        pathString = os.path.join(r"\foo%i"%something,"bar.log")
        print pathString

ただし、次のコードは pathos.multiprocessing で機能します。

import multiprocessing
from pathos.multiprocessing import ProcessPool

class SomethingDoer:
    '''Probably does some thing'''
    def doAllSomethings(self,allSomethings):
        cores = multiprocessing.cpu_count()-1
        pool = ProcessPool(nodes=cores)
        for something in allSomethings:
            someProcess = self.doSomething, something
            pool.apipe(*someProcess)

    def doSomething(self,something):
        import os
        pathString = os.path.join(r"\foo%i"%something,"bar.log")
        print pathString

次の例では

import time
p = SomethingDoer()
p.doAllSomethings(range(3))
while 1:
    time.sleep(.1)

コードの両方の部分は、次の出力を出力する必要があります (明らかに、必ずしも同じ順序であるとは限りません)。

\foo0\bar.log
\foo1\bar.log
\foo2\bar.log

これはコードベースの残りの部分と一致しているため、コードの最初のスニペットのいくつかのバリエーションを使用できるようにしたいと考えています。ただし、どんな助けでも大歓迎です。

4

1 に答える 1