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