栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

python multiprocessing:写入相同的excel文件

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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( . )]
开始 n
processes
。A
process
终止于
queue.Empty

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

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


不能

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

的用法

mp.Pool
,例如:

def f1(k):  # *** DO SOME STUFF HERE***  results = pd.Dataframe(df_)  return resultsif __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 fromtry:    # Python3    import queueexcept:    # Python 2    import Queue as queuedef 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:3.4.2测试-熊猫:0.19.2-xlsxwriter:0.9.6



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/669370.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号