我有一个使用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)
我会将该函数写入日志文件吗?如果是这样,如果(作为一个假设)一百万个进程试图写入同一个文件,那么事情是否会相互覆盖?
答案 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
这给了我一个结果列表