预期思路:
应用python的多进程模块,multiprocessing创建进程池执行某项统计任务,结果保存在queue对象中,主进程在所有子进程结束后读取该queue
from multiprocessing import Process, Queue, Pool
def func(msg, q):
q.put(msg)
if __name__ == '__main__':
pool = Pool(processes=4)
q = Queue()
for i in range(7):
result = pool.apply_async(func, (i, q))
pool.close()
pool.join()
print(result.successful())
print(q.qsize())
运行结果为0,发现并没有子进程在执行。
但如果上例中去除Queue对象的使用,直接在func过程中 print(msg) 则正常执行
===== 补充 =====
如果不采用Queue保存子进程结果,换用Manager 处理共享变量
def countNum(records, q):
counts = 0
for line in records: #统计传入列表字符串的长度总和
counts += len(line)
q.append(counts)
if __name__ == '__main__':
row = 2
begin = 0
manager = Manager()
v_list = []<span style="white-space:pre"> </span> # 共享列表
v_list = manager.list()
p = Pool(3)
recs = linecache.getlines('tmp.txt')[begin:begin+row] #每次取出文件的两行
while recs:
p.apply_async(countNum, (recs, v_list))
begin += row
recs = linecache.getlines('tmp.txt')[begin:begin+row]
p.close()
p.join()
print(v_list)