Python,pathos-新线程上的名称空间更改
我开始使用paths.multiprocessing来消除在处理logging.logger等非平凡对象时的一些头痛问题。但是,我遇到了导入在新线程中不可用的问题。因此,我必须在新线程中“重新导入”这些模块。具体而言,由于以下错误,此案例将不会运行:Python,pathos-新线程上的名称空间更改,python,multithreading,pathos,Python,Multithreading,Pathos,我开始使用paths.multiprocessing来消除在处理logging.logger等非平凡对象时的一些头痛问题。但是,我遇到了导入在新线程中不可用的问题。因此,我必须在新线程中“重新导入”这些模块。具体而言,由于以下错误,此案例将不会运行: NameError: global name 'os' is not defined e Found at: multiprocess.pool result = True, func(*args, **kwds) 以下代码即使在内置多处理模
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
但是,以下代码将用于paths.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)
这两段代码都应输出以下输出(显然不一定以相同的顺序):
我希望能够使用第一段代码的一些变体,因为这与代码库的其余部分是一致的。不过,我们非常感谢您的帮助。我是《悲情代码》的作者。如果您将
pathos
更新为使用multiprocess
(而不是processing
,这是一个更老的分支),您的代码应该按预期工作
>>> import os
>>> import pathos.helpers as 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","bar.log")
...
>>> p = SomethingDoer()
>>> p.doAllSomethings(range(3))
>>> p.doSomething(range(3))
>>>
注意,您可能希望获得最新版本的dill
,它更好地支持全局变量的pickle跟踪。要修改dill(从而修改pathos)处理全局变量的方式,可以执行以下操作:
>>> import dill
>>> dill.settings['recurse'] = True
无法保证哪种设置最适合您的情况,但它会为您提供选项
编辑:以响应您的更新。
这是有效的:在这里,你会注意到我正在做一个“get”
而不是活蹦乱跳地扔水池,等待
要检索的响应
import os
import pathos.helpers as multiprocessing
from pathos.multiprocessing import ProcessPool
class SomethingDoer:
'''Probably does some thing'''
def doAllSomethings(self,allSomethings):
cores = multiprocessing.cpu_count()-1
pool = ProcessPool(cores)
for something in allSomethings:
someProcess = self.doSomething, something
pool.apipe(*someProcess).get()
#pool.clear()
def doSomething(self,something):
pathString = os.path.join(r"\foo%i"%something,"bar.log")
print pathString
if __name__ == '__main__':
import time
p = SomethingDoer()
print p.doAllSomethings(range(3))
另一种方法是不使用get
,而是取消对清除
的注释…实际上是破坏池pathos
在单例中保留池,
因此,多次运行在每次设置池时的开销较小
我得到的结果和你预测的不完全一样
>$ python testme.py
\foo0/bar.log
\foo1/bar.log
\foo2/bar.log
None
如果您发现这是意外的行为,而且也是不正确的,请填写错误报告。哦,我建议的设置没有任何区别——使用“新型”类
SomethingDoer(object)
我是pathos
的作者。如果您将pathos
更新为使用multiprocess
(而不是processing
,这是一个更老的分支),您的代码应该按预期工作
>>> import os
>>> import pathos.helpers as 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","bar.log")
...
>>> p = SomethingDoer()
>>> p.doAllSomethings(range(3))
>>> p.doSomething(range(3))
>>>
注意,您可能希望获得最新版本的dill
,它更好地支持全局变量的pickle跟踪。要修改dill(从而修改pathos)处理全局变量的方式,可以执行以下操作:
>>> import dill
>>> dill.settings['recurse'] = True
无法保证哪种设置最适合您的情况,但它会为您提供选项
编辑:以响应您的更新。
这是有效的:在这里,你会注意到我正在做一个“get”
而不是活蹦乱跳地扔水池,等待
要检索的响应
import os
import pathos.helpers as multiprocessing
from pathos.multiprocessing import ProcessPool
class SomethingDoer:
'''Probably does some thing'''
def doAllSomethings(self,allSomethings):
cores = multiprocessing.cpu_count()-1
pool = ProcessPool(cores)
for something in allSomethings:
someProcess = self.doSomething, something
pool.apipe(*someProcess).get()
#pool.clear()
def doSomething(self,something):
pathString = os.path.join(r"\foo%i"%something,"bar.log")
print pathString
if __name__ == '__main__':
import time
p = SomethingDoer()
print p.doAllSomethings(range(3))
另一种方法是不使用get
,而是取消对清除
的注释…实际上是破坏池pathos
在单例中保留池,
因此,多次运行在每次设置池时的开销较小
我得到的结果和你预测的不完全一样
>$ python testme.py
\foo0/bar.log
\foo1/bar.log
\foo2/bar.log
None
如果您发现这是意外的行为,而且也是不正确的,请填写错误报告。哦,我建议的设置没有任何区别——使用“新型”类
SomethingDoer(object)
我也不太清楚你的意思。我有最新的pathos库,因为我在写这篇文章的前一天直接下载了一个zip。啊…processing
仍在安装。我不想为现有安装的用户提供太多信息,所以如果找到了处理
,就会使用它。但是,如果找不到它,则使用多进程
<代码>Paths正在查找旧库。尝试删除处理
。我也许应该改变这一点,因此它总是倾向于使用新的底层fork。如果您有多进程
,那么只需删除处理
就可以了。我用调试器验证了它实际上使用的是多进程。我不想问这个问题,因为你已经帮了这么多忙了,但是你能试着运行上面的例子吗?这个例子现在包含了一个print语句。我问这个问题的原因是因为我忘了在pool.py的第115行提到它会无声地“失败”,如果没有print语句,您就不会意识到该方法没有完成。我不太清楚您的意思。我有最新的pathos库,因为我在写这篇文章的前一天直接下载了一个zip。啊…processing
仍在安装。我不想为现有安装的用户提供太多信息,所以如果找到了处理
,就会使用它。但是,如果找不到它,则使用多进程
<代码>Paths正在查找旧库。尝试删除处理
。我也许应该改变这一点,因此它总是倾向于使用新的底层fork。如果您有多进程
,那么只需删除处理
就可以了。我用调试器验证了它实际上使用的是多进程。我不想问这个问题,因为你已经帮了这么多忙了,但是你能试着运行上面的例子吗?这个例子现在包含了一个print语句。我问这个问题的原因是因为我忘了在pool.py的第115行提到它以静默方式“失败”,如果没有print语句,您就不会意识到该方法没有完成。