concurrent.futures不并行写入

时间:2016-07-19 10:51:32

标签: python multithreading python-3.x concurrent.futures

我有一个列表dataframe_chunk,其中包含一个非常大的pandas数据帧的块。我想将每个块写入不同的csv,并且要并行执行。但是,我看到文件是按顺序写的,我不确定为什么会这样。这是代码:

import concurrent.futures as cfu

def write_chunk_to_file(chunk, fpath):  
    chunk.to_csv(fpath, sep=',', header=False, index=False)

pool = cfu.ThreadPoolExecutor(N_CORES)

futures = []
for i in range(N_CORES):
    fpath = '/path_to_files_'+str(i)+'.csv'
    futures.append(pool.submit( write_chunk_to_file(dataframe_chunk[i], fpath)))

for f in cfu.as_completed(futures):
    print("finished at ",time.time())

任何线索?

1 个答案:

答案 0 :(得分:0)

Python 2.7.x threading docs中陈述的一件事 但不是在3.x文档中 Python无法使用concurrent.futures库实现真正的并行性 - 一次只能执行一个线程。

您应该尝试将multiprocessingProcessPoolExecutor一起使用,它为每个作业使用单独的进程,因此可以在多核CPU上实现真正的并行性。

<强>更新

以下是适合使用#!/usr/bin/env python3 from multiprocessing import Process import os import time N_CORES = 8 def write_chunk_to_file(chunk, fpath): with open(fpath, "w") as f: for x in range(10000000): f.write(str(x)) futures = [] print("my pid:", os.getpid()) input("Hit return to start:") start = time.time() print("Started at:", start) for i in range(N_CORES): fpath = './tmp/file-'+str(i)+'.csv' p = Process(target=write_chunk_to_file, args=(i,fpath)) futures.append(p) for p in futures: p.start() print("All jobs started.") for p in futures: p.join() print("All jobs finished at ",time.time()) 库的程序:

while true; do clear; pstree 12345; ls -l tmp; sleep 1; done

您可以在另一个窗口中使用此shell命令监视作业:

GRAND_MODEL | GRAND_WORKFLOW | WAIT_4_MODEL | WAIT_4_WORKFLOW
 DWH_Model1     WF_workflow1    DWH_Model3      WF_Workflow3_1
 DWH_Model1     WF_workflow1    DWH_Model4      WF_Workflow4_1
 DWH_Model2     WF_workflow2_1  DWH_Model1      WF_Workflow1

(将12345替换为脚本发出的pid。)