Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,pathos-新线程上的名称空间更改_Python_Multithreading_Pathos - Fatal编程技术网

Python,pathos-新线程上的名称空间更改

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) 以下代码即使在内置多处理模

我开始使用paths.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
但是,以下代码将用于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语句,您就不会意识到该方法没有完成。