写在前面:
在读写很多个文件的任务中经常用到多进程技术,下面记录我实现的第一个python多进程程序.
测试任务描述:
测试任务描述:在一个列表里有四个子列表,每个存500万数字,目的是统计这个大列表中的元素个数,存在字典里。
对比实验:用多进程和单进程的处理时间对比。
多进程代码说明:
process_job:每个进程单独执行的函数
callback_function:回调函数
代码逻辑:l1中的每个列表依次访问新进程,并且在新进程中执行process_job,返回值传给callback_function,call_back_function将进程返回结果整合到最后的输出字典中。
代码:
import multiprocessing
import time
def callback_function(x):
for k, v in x.items():
if k in res:
res[k] += v
else:
res[k] = v
def process_job(nums):
cur_dic = {}
for i in nums:
if i in cur_dic:
cur_dic[i] += 1
else:
cur_dic[i] = 1
return cur_dic
if __name__ == '__main__':
l1 = [[1] * 5000000, [2] * 5000000, [1] * 5000000, [2] * 5000000]
# multiprocess
tim1 = time.clock()
pool = multiprocessing.Pool(processes=2)
res = {}
for i in l1:
pool.apply_async(process_job, (i,), callback=callback_function)
pool.close()
pool.join()
print res
print time.clock() - tim1
# normal
time2 = time.clock()
res = {}
for l in l1:
for i in l:
if i in res:
res[i] += 1
else:
res[i] = 1
print res
print time.clock() - time2
实验结果:
{1: 10000000, 2: 10000000}
0.754238
{1: 10000000, 2: 10000000}
2.832794
在4核的服务器上测试的数据,多进程的速度是单进程的大约四倍
存在的问题:
1.processes参数好像不起作用,调整没有明显变化,多进程都是单进程的大约4倍。
暂时不知道什么原因(2019-01-16)