Python 与paths.multiprocessing并行安全写入文件

Python 与paths.multiprocessing并行安全写入文件,python,python-multiprocessing,pathos,Python,Python Multiprocessing,Pathos,pathos.Python中的多处理比多处理库具有优势,因为前者使用dill而不是pickle,并且可以序列化更广泛的函数和其他内容 但是,当使用pathos将pool.map()结果按行写入文件时,会遇到一些麻烦。如果ProcessPool中的所有进程将结果逐行写入单个文件,它们将相互干扰,同时写入一些行,从而破坏作业。在使用普通的多处理软件包时,我能够使进程写入它们自己的单独文件,并使用当前进程id命名,如下所示: example_data = range(100) def process_

pathos.Python中的多处理
多处理
库具有优势,因为前者使用
dill
而不是
pickle
,并且可以序列化更广泛的函数和其他内容

但是,当使用
pathos
pool.map()
结果按行写入文件时,会遇到一些麻烦。如果
ProcessPool
中的所有进程将结果逐行写入单个文件,它们将相互干扰,同时写入一些行,从而破坏作业。在使用普通的
多处理
软件包时,我能够使进程写入它们自己的单独文件,并使用当前进程id命名,如下所示:

example_data = range(100)
def process_point(point):
    output = "output-%d.gz" % mpp.current_process().pid
    with gzip.open(output, "a+") as fout:
        fout.write('%d\n' % point**2)
然后,此代码运行良好:

import multiprocessing as mpp
pool = mpp.Pool(8)
pool.map(process_point, example_data)
但该代码不:

from pathos import multiprocessing as mpp
pool = mpp.Pool(8)
pool.map(process_point, example_data)
并抛出属性错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-10-a6fb174ec9a5> in <module>()
----> 1 pool.map(process_point, example_data)

/usr/local/lib/python2.7/dist-packages/processing-0.52_pathos-py2.7-linux-x86_64.egg/processing/pool.pyc in map(self, func, iterable, chunksize)
    128         '''
    129         assert self._state == RUN
--> 130         return self.mapAsync(func, iterable, chunksize).get()
    131
    132     def imap(self, func, iterable, chunksize=1):

/usr/local/lib/python2.7/dist-packages/processing-0.52_pathos-py2.7-linux-x86_64.egg/processing/pool.pyc in get(self, timeout)
    371             return self._value
    372         else:
--> 373             raise self._value
    374
    375     def _set(self, i, obj):

AttributeError: 'module' object has no attribute 'current_process'
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
---->1池图(过程点、示例数据)
/映射中的usr/local/lib/python2.7/dist-packages/processing-0.52_pathos-py2.7-linux-x86_64.egg/processing/pool.pyc(self、func、iterable、chunksize)
128         '''
129断言自我。_状态==运行
-->130返回self.mapsync(func,iterable,chunksize).get()
131
132 def imap(self、func、iterable、chunksize=1):
/get中的usr/local/lib/python2.7/dist-packages/processing-0.52_pathos-py2.7-linux-x86_64.egg/processing/pool.pyc(self,超时)
371返回自身值
372其他:
-->373提高自我价值
374
375 def_装置(自、i、obj):
AttributeError:“模块”对象没有“当前进程”属性

pathos
中没有
当前的\u进程()
,我找不到任何类似的。有什么想法吗?

这个简单的小把戏似乎很管用:

import multiprocessing as mp
from pathos import multiprocessing as pathos_mp
import gzip

example_data = range(100)
def process_point(point):
    output = "output-%d.gz" % mp.current_process().pid
    with gzip.open(output, "a+") as fout:
        fout.write('%d\n' % point**2)

pool = pathos_mp.Pool(8)
pool.map(process_point, example_data)

换句话说,可以使用
pathos
进行并行计算,使用普通的
多处理
包获取当前进程的id,这将正常工作

这个简单的小把戏似乎很管用:

import multiprocessing as mp
from pathos import multiprocessing as pathos_mp
import gzip

example_data = range(100)
def process_point(point):
    output = "output-%d.gz" % mp.current_process().pid
    with gzip.open(output, "a+") as fout:
        fout.write('%d\n' % point**2)

pool = pathos_mp.Pool(8)
pool.map(process_point, example_data)

换句话说,可以使用
pathos
进行并行计算,使用普通的
多处理
包获取当前进程的id,这将正常工作

我是《悲情密码》的作者。虽然您的答案适用于这种情况,但最好使用
pathos
中的
多处理
分支,该分支位于相当迟钝的位置:
pathos.helpers.mp

这为您提供了一对一的映射,具有
多处理
,但具有更好的序列化。因此,您将使用
pathos.helpers.mp.current\u进程


抱歉,这两个问题都没有文档记录,也不明显……我至少应该改进这两个问题中的一个。

我是《悲情》的作者。虽然您的答案适用于这种情况,但最好使用
pathos
中的
多处理
分支,该分支位于相当迟钝的位置:
pathos.helpers.mp

这为您提供了一对一的映射,具有
多处理
,但具有更好的序列化。因此,您将使用
pathos.helpers.mp.current\u进程


抱歉,这两个问题都没有文档记录,也不明显……我至少应该改进这两个问题中的一个。

谢谢!下面是最后的效果:
pathos.helpers.mp.currentProcess().getPid()
谢谢!下面是最后起作用的内容:
pathos.helpers.mp.currentProcess().getPid()