在哪里写并行程序输出到?

时间:2014-07-08 00:45:49

标签: python parallel-processing multiprocessing

我有一个使用pool.map()来使用十个并行工作程序获取值的程序。我无法绕过我的想法,将这些值重新拼接在一起以便最后利用它。

我的结构是这样的:

initial_input = get_initial_values()
pool.map(function, initial_input)
pool.close()
pool.join()

# now how would I get the output?
send_ftp_of_output(output_data)

我会将该函数写入日志文件吗?如果是这样,如果(作为一个假设)一百万个进程试图写入同一个文件,那么事情是否会相互覆盖?

3 个答案:

答案 0 :(得分:2)

pool.map(function,input) 

返回一个列表。

您可以通过执行以下操作获得输出:

output_data = pool.map(function,input) 

pool.map只是在paralell中运行map函数,但它仍然只返回一个列表。如果你没有在你正在映射的函数中输出任何东西(你不应该),那么它只返回一个列表。这与map()的作用相同,除了它在并行执行。

答案 1 :(得分:1)

关于日志文件,是的,将多个线程直接放在同一个地方会在日志文件中交错。你可以让线程在写入之前记录文件,这样可以确保在进入中间不会中断某些内容,但它仍会在所有线程之间按时间顺序交错。由于涉及的开销,每次锁定日志文件也会显着减慢日志记录。

您还可以使用线程编号 - %(thread)d - 或记录 Formatter 输出中的其他识别标记,这将有助于区分,但它仍然很难遵循,特别是对于一堆线程。

不确定这是否适用于您的特定应用,因为您的应用中的细节可能会排除它,但是,我强烈建议您考虑 GNU Parallel http://www.gnu.org/software/parallel/)来执行此操作并行工作。 (你可以使用subprocess.check_output来调用它。)

这样做的好处有几个,主要是你可以很容易地改变并行工作者的数量 - 直到并行在机器上每个核心使用一个工作者 - 它将管道相应的项目。另一个主要好处,也就是与你的问题更具体相关的一个好处是,它会将所有这些并行工作者的输出组合在一起,就好像它们已被连续调用一样。

如果您的程序无法正常工作,例如,从应用程序中的文件传输并并行化的单个命令行,您可能会使您的 Python 代码成为单工作者然后,当命令通过管道连接到 parallel 时,使其成为 Python 命令行的多个排列,每次都改变目标,然后输出结果。

我经常将 GNU Parallel Python 结合使用,通常用来做事情,例如,使用<同时进行6个 Postgres 查询来自50个项目列表的em> psql 。

答案 2 :(得分:0)

使用Tritlo的建议,这对我有用:

def run_updates(input_data):
    # do something
    return {data}

if __name__ == '__main__':

    item = iTunes()
    item.fetch_itunes_pulldowns_to_do()
    initial_input_data = item.fetched_update_info

    pool = Pool(NUM_IN_PARALLEL)
    result = pool.map(run_updates, initial_input_data)
    pool.close()
    pool.join()
    print result

这给了我一个结果列表