正确处理以Python编写输出的并行函数

Moustachio

我有一个函数,将文本文件作为输入,进行一些处理,然后将腌制的结果写入文件。我正在尝试在多个文件中并行执行此操作。文件的处理顺序无关紧要,每个文件的处理是完全独立的。这是我现在所拥有的:

import mulitprocessing as mp
import pandas as pd
from glob import glob

def processor(fi):
    df = pd.read_table(fi)
    ...do some processing to the df....

   filename = fi.split('/')[-1][:-4]
   df.to_pickle('{}.pkl'.format(filename))

if __name__ == '__main__':

    files = glob('/path/to/my/files/*.txt')
    pool = mp.Pool(8) 

    for _ in pool.imap_unordered(processor, files):
        pass

现在,据我所知,它实际上完全可以正常工作,但是语法看起来确实很棘手,我想知道是否有更好的解决方法。例如,我可以执行相同的结果而不必执行显式循环吗?

我试过了map_async(processor, files),但这不会生成任何输出文件(但不会引发任何错误)。

有什么建议吗?

达夫扎兹

您可以使用map_async,但是您需要等待它完成,因为该async位的意思是“启动作业后不要阻塞,而是立即返回”。如果您不等待,那么在代码执行后没有任何反应,您的程序将退出,并且所有子进程将立即被杀死,并且在完成之前就被杀死,这不是您想要的!

以下示例应有帮助:

from multiprocessing.pool import Pool
from time import sleep

def my_func(val):
    print('Executing %s' % val)
    sleep(0.5)
    print('Done %s' % val)

pl = Pool()
async_result = pl.map_async(my_func, [1, 2, 3, 4, 5])

res = async_result.get()
print('Pool done: %s' % res)

(当我运行它时)的输出是:

Executing 2
Executing 1
Executing 3
Executing 4
Done 2
Done 1
Executing 5
Done 4
Done 3
Done 5
Pool done: [None, None, None, None, None]

另外,使用Plainmap也可以解决问题,然后您不必等待它,因为它不是“异步”的,并且可以同步地等待所有作业完成:

pl = Pool()
res = pl.map(my_func, [1, 2, 3, 4, 5])
print('Pool done: %s' % res)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章