您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python multiprocessing:写入相同的excel文件

python multiprocessing:写入相同的excel文件

1)为什么在第二种方法中的多个地方实现time.sleep?

在中__main__time.sleep(0.1)将启动process的时间片分配给启动。 在中f2(fq, q)queue使用时间片将所有缓冲的数据刷新到管道q.get_Nowait()。 在中w(q),仅用于模拟长期运行writer.to_excel(...),我删除了此。

2)pool.map和pool = [mp.Process(。)]有什么区别?

使用pool.map不需要no Queue,不传递任何参数,代码更短。在worker_process必须立即返回result并终止。pool.map只要iteration完成所有操作,便开始新的过程。在results具有后进行处理。

使用pool = [mp.Process( . )]开始 processes。Aprocess终止于queue.Empty

您能想到一种情况,您更喜欢一种方法吗?

方法1:快速设置,序列化,仅对结果感兴趣,然后继续。 方法2:如果要 执行所有工作负载

global writer在流程中使用。 该writer实例必须属于一个process

用法 mp.Pool,例如:

def f1(k):
  # *** DO SOME STUFF HERE***
  results = pd.DataFrame(df_)
  return results

if __name__ == '__main__':
    pool = mp.Pool()
    results = pool.map(f1, range(len(list_of_days)))

    writer = pd.ExcelWriter('../test/myfile.xlsx', engine='xlsxwriter')
    for k, result in enumerate(results):
        result.to_excel(writer, sheet_name=list_of_days[k])

    writer.save()
    pool.close()

这导致.to_excel(...)__main__过程中被依次调用

如果要并行.to_excel(...),则必须使用mp.Queue()。 例如:

worker过程:

# mp.Queue exeptions have to load from
try:
    # python3
    import queue
except:
    # Python 2
    import Queue as queue

def f2(fq, q):
    while True:
        try:
            k = fq.get_Nowait()
        except queue.Empty:
            exit(0)

        # *** DO SOME STUFF HERE***

        results = pd.DataFrame(df_)
        q.put( (list_of_days[k], results) )
        time.sleep(0.1)

writer过程:

def w(q):
    writer = pd.ExcelWriter('myfile.xlsx', engine='xlsxwriter')
    while True:
        try:
            titel, result = q.get()
        except ValueError:
            writer.save()
            exit(0)

        result.to_excel(writer, sheet_name=titel)

__main__过程:

if __name__ == '__main__':
    w_q = mp.Queue()
    w_p = mp.Process(target=w, args=(w_q,))
    w_p.start()
    time.sleep(0.1)

    f_q = mp.Queue()
    for i in range(len(list_of_days)):
        f_q.put(i)

    pool = [mp.Process(target=f2, args=(f_q, w_q,)) for p in range(os.cpu_count())]
    for p in pool:
        p.start()
        time.sleep(0.1)

    for p in pool:
        p.join()

    w_q.put('STOP')
    w_p.join()

python 2022/1/1 18:47:45 有335人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶