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()