我开始用病理学.多处理去除酸洗时的一些头痛,如日志记录程序. 但是,我遇到了一个问题,即导入在新线程中不可用。因此,我必须在新线程中“重新导入”这些模块。具体来说,由于以下错误,此案例将不会运行:
NameError: global name 'os' is not defined
e Found at: multiprocess.pool
result = True, func(*args, **kwds)
以下代码即使在内置多处理模块下也无法工作:
^{pr2}$但是,以下代码将与病理学.多处理在
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
我希望能够使用第一个代码片段的一些变体,因为这与代码库的其余部分是一致的。但是,任何帮助都是非常感谢的。在
我是},这是一个老得多的fork),那么您的代码应该可以正常工作。在
pathos
的作者。如果您更新您的pathos
以使用multiprocess
(而不是{注意,您可能希望得到
^{pr2}$dill
的最新版本,它对全局变量的pickle跟踪有更好的支持。要修改dill
(因此pathos
)如何处理全局变量,可以执行以下操作:无法保证哪些设置最适合您的情况,但它为您提供了选择。在
编辑:以响应您的更新。 这个有效:在这里你会注意到我在做一个“get” 而不是把游泳池活生生地吊起来,等待 要检索的响应。在
另一种方法是不使用
get
,但是取消对clear
的注释……这实际上是在破坏池。pathos
在单例中保留池, 这样,每次设置池时多个运行的开销就更少了。在我得到的结果和你预测的不完全一样。在
如果您发现这是意外行为,也不正确,请填写错误报告。哦,我建议的设置没有任何区别,也没有使用“新样式”类
SomethingDoer(object)
相关问题 更多 >
编程相关推荐