Python,pathos名称空间在新线程上发生更改

2024-04-27 14:49:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始用病理学.多处理去除酸洗时的一些头痛,如日志记录程序. 但是,我遇到了一个问题,即导入在新线程中不可用。因此,我必须在新线程中“重新导入”这些模块。具体来说,由于以下错误,此案例将不会运行:

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

我希望能够使用第一个代码片段的一些变体,因为这与代码库的其余部分是一致的。但是,任何帮助都是非常感谢的。在


Tags: 模块代码importselflogosdefbar
1条回答
网友
1楼 · 发布于 2024-04-27 14:49:55

我是pathos的作者。如果您更新您的pathos以使用multiprocess(而不是{},这是一个老得多的fork),那么您的代码应该可以正常工作。在

>>> 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)如何处理全局变量,可以执行以下操作:

^{pr2}$

无法保证哪些设置最适合您的情况,但它为您提供了选择。在

编辑:以响应您的更新。 这个有效:在这里你会注意到我在做一个“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,但是取消对clear的注释……这实际上是在破坏池。pathos在单例中保留池, 这样,每次设置池时多个运行的开销就更少了。在

我得到的结果和你预测的不完全一样。在

>$ python testme.py 
\foo0/bar.log
\foo1/bar.log
\foo2/bar.log
None

如果您发现这是意外行为,也不正确,请填写错误报告。哦,我建议的设置没有任何区别,也没有使用“新样式”类SomethingDoer(object)

相关问题 更多 >