繁体   English   中英

将并行化程序输出写入哪里?

[英]Where to write parallelized program output to?

我有一个程序使用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)

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

pool.map(function,input) 

返回列表。

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

output_data = pool.map(function,input) 

pool.map只是在paralell中运行map函数,但它仍然仅返回一个列表。 如果您在映射的函数中不输出任何东西(您不应该),那么它只会返回一个列表。 这与map()相同,只是它在paralell中执行。

关于日志文件,是的,拥有多个到同一位置的线程权限将在日志文件中交织。 您可以在写入之前让线程将文件记录在文件中,这样可以确保某些内容不会在进入过程中被打断,但是仍然可以按时间顺序在所有线程之间插入事物。 由于所涉及的开销,每次锁定日志文件也会大大减慢日志记录的速度。

您也可以说线程号- %(thread)d日志记录 格式化程序输出中的其他一些有助于区分的标记,但是仍然很难遵循,特别是对于一堆线程。

不知道这是否可以在您的特定应用程序中使用,因为您的应用程序中的特定内容可能会阻止它,但是,我强烈建议您考虑使用GNU Parallelhttp://www.gnu.org/software/parallel/ )进行并行化工作。 (您可以使用subprocess.check_output调用它)。

这样做的好处是多方面的,主要是您可以轻松地改变并行工作程序的数量-最多可以在计算机上每个内核并行使用一个工作程序-它将相应地流水作业。 另一个主要的好处,也是与您的问题更具体相关的另一个好处是,它将所有这些并行工作程序的输出缝合在一起,就像它们是被串行调用一样。

如果您的程序无法正常运行,例如,从应用程序中的文件中通过管道传递单个命令行并对其进行并行化,则可以使Python代码为单一代码,然后将命令传递给parallel ,使其成为一个数字Python命令行的排列,每次更改目标,然后让其输出结果。

我经常将GNU ParallelPython结合使用,经常做事,例如使用50个列表中的psql同时进行6个Postgres查询。

使用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

这给了我结果列表

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM