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



