我开始使用 pathos.multiprocessing 来消除在处理诸如 logging.logger 之类的重要对象时的一些麻烦。但是,我遇到了导入在新线程中不可用的问题。结果,我必须在那个新线程中“重新导入”这些模块。具体来说,由于以下错误,此案例将无法运行:
NameError: global name 'os' is not defined
e Found at: multiprocess.pool
result = True, func(*args, **kwds)
即使在内置的多处理模块下,以下代码也不起作用:
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
我希望能够使用第一段代码的一些变体,因为这与代码库的其余部分一致。但是,非常感谢任何帮助。