多处理更改每个进程的当前文件夹

2024-10-01 15:43:17 发布

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

我试图用multiprocessing模块来并行化一些计算。在

如何确保multiprocessing.Pool.map_async生成的每个进程都在不同的(以前创建的)文件夹上运行?

问题是,每个进程都会调用一些第三部分库来将临时文件写入磁盘,如果在同一个文件夹中运行其中的许多部件,则会将其中一个部件与另一个部件弄乱。在

另外,我不能为map_async的每个函数调用创建一个新的文件夹,而是希望创建尽可能少的文件夹(即每个进程一个)。在

代码与此类似:

import multiprocessing,os,shutil
processes=16

#starting pool
pool=multiprocessing.Pool(processes)

#The asked dark-magic here?

devshm='/dev/shm/'
#Creating as many folders as necessary
for p in range(16):
    os.mkdir(devshm+str(p)+'/')
    shutil.copy(some_files,p)

def example_function(i):
    print os.getcwd()
    return i*i
result=pool.map_async(example_function,range(1000))

以便在任何时候,对example_函数的每次调用都在不同的文件夹上执行。

我知道一个解决方案可能是使用子进程来生成不同的进程,但是我想坚持多处理(我需要为每个派生的子进程pickle一些对象、写到磁盘、读取、取消pickle,而不是通过函数调用传递对象本身(使用functools.partial) . 在

附言

This question在某种程度上是相似的,但是这个解决方案不能保证每个函数调用都发生在不同的文件夹上,这确实是我的目标。在


Tags: 文件夹mapasync进程os部件examplemultiprocessing
1条回答
网友
1楼 · 发布于 2024-10-01 15:43:17

由于您没有在问题中指定,我假设您在函数执行完毕后不需要目录的内容。

绝对最简单的方法是在使用它们的函数中创建和销毁临时目录。这样,剩下的代码就不关心工作进程的环境/目录,Pool就很适合了。我还将使用python的内置功能来创建临时目录:

import multiprocessing, os, shutil, tempfile
processes=16

def example_function(i):
    with tempfile.TemporaryDirectory() as path:
        os.chdir(path)
        print(os.getcwd())
        return i*i

if __name__ == '__main__':
    #starting pool
    pool=multiprocessing.Pool(processes)

    result=pool.map(example_function,range(1000))

注意:^{}是在Python3.2中引入的。如果您使用的是较旧版本的python,则可以copy the wrapper class into your code。在

如果你真的需要预先设置目录。。。在

尝试使用Pool来实现这一点有点麻烦。可以传递要与数据一起使用的目录名,但只能传递等于目录数的初始值。然后,您需要使用imap_unordered之类的东西来查看结果何时完成(并且它的目录可供重用)。在

在我看来,一个更好的方法是根本不使用Pool,而是创建单独的Process对象并将每个对象分配到一个目录。如果您需要控制Process环境的某个部分,这通常会更好,当您的问题是数据驱动的且不关心进程或其环境时,Pool通常会更好。在

传递数据到流程对象/从流程对象传递数据有不同的方法,但最简单的方法是队列:

^{pr2}$

相关问题 更多 >

    热门问题