文章目录(Table of Contents)
前言
这一篇文章记录一下Python的多进程的用法,会举两个例子来说明一下。
这两个例子都会要求输入多个参数,我分别提供了两种解决的方法,分别是使用starmap和把参数作为一个数组进行传入。
举例
例子一
第一个例子是使用starmap传入多个参数。下面就直接贴代码了,注释写得很明白了。
- import multiprocessing
- import time
- def SaySomething(blessing,name):
- time.sleep(1)
- print(time.ctime()) # 打印程序开始运行的时间
- return blessing + ',' + name
- """传入多个参数,并且返回值
- """
- p = multiprocessing.Pool(2) #初始化一个2个进程的进程池
- # 传入多个参数的构造(扩展为多个参数)
- blessings = ['Good Night','Have a good dream']
- names = ['Zq','WMN7']
- par_lists = [[blessings[i],names[i]] for i in range(len(names))] # 构造参数
- rslt = p.starmap(SaySomething,par_lists) # 进行多线程运算
- # 直接的写法
- # rslt = p.starmap(test,(['Good Night','Zq'],['Good Night','WMN7']))
- print('多进程返回值 : ',rslt)
程序返回:
- >> Thu Jun 7 18:01:24 2018
- >> Thu Jun 7 18:01:24 2018
- >> 多进程返回值 : ['Good Night,Zq', 'Have a good dream,WMN7']
可以看到这两次函数的调用是在同一时间启动的。
例子二
这一个例子是通过列表(list)传入多个参数的:
- import multiprocessing
- import time
- # 多个参数通过列表传入
- def SaySomethingOne(thing):
- blessing = thing[0]
- name = thing[1]
- time.sleep(1)
- print(time.ctime()) # 打印程序开始运行的时间
- return blessing + ',' + name
- # 使用多进程进行计算
- p = multiprocessing.Pool(2) #初始化一个2个进程的进程池
- # 传入多个参数的构造(扩展为多个参数)
- blessings = ['Good Night','Have a good dream']
- names = ['Zq','WMN7']
- par_lists = [[blessings[i],names[i]] for i in range(len(names))] # 构造参数
- rslt = p.map(SaySomethingOne,par_lists) # 进行多线程运算
- # 直接的写法
- # rslt = p.starmap(test,(['Good Night','Zq'],['Good Night','WMN7']))
- print('多进程返回值 : ',rslt)
- # 使用单进程进行计算
- print('下面使用单进程进行运算进行对比 : ')
- rslt = map(SaySomethingOne,par_lists)
- for i in rslt:
- print(i)
我们看一下最后的输出:
- >> Thu Jun 7 18:06:34 2018
- >> Thu Jun 7 18:06:34 2018
- >> 多进程返回值 : ['Good Night,Zq', 'Have a good dream,WMN7']
- >> 下面使用单进程进行运算进行对比 :
- >> Thu Jun 7 18:06:35 2018
- >> Good Night,Zq
- >> Thu Jun 7 18:06:36 2018
- >> Have a good dream,WMN7
可以看到使用多进程是在同一时间启动的,上面的时间都是 Thu Jun 7 18:06:34 2018,下面单线程是分别进行启动的,可以看到时间是差了1秒,因为我们在上面有time.sleep(1)。
一个处理文件的例子
下面是一个使用多进程处理文件的例子,每次读取文件的n行进行处理;主要看deal_with_file这个函数。
- import time
- from multiprocessing import Pool
- from itertools import islice
- from similarity_plate_model import deal_with_content
- from carNum_model import same_carNum_different_owner
- def deal_with_file(input_file, output_file='output.txt',process=10,total_file_process=10, type=0):
- """处理文件,负责输入和输出,使用多进程进行操作
- """
- print('输入文件名称 : ',input_file)
- print('输出文件名称 : ',output_file)
- print('开启进程个数 : ',process)
- pool = Pool(processes=process) # 进程个数
- circle = 0
- t1 = time.time()
- with open(input_file,'r') as in_f, open(output_file,'w') as out_f:
- while True:
- """每次同时处理total_file_process行
- """
- next_n_lines = list(islice(in_f, total_file_process))
- if not next_n_lines:
- break
- else:
- if type==0:
- """对next_n_lines执行deal_with_content函数
- """
- result = pool.map(deal_with_content,next_n_lines)
- elif type==1:
- result = pool.map(same_carNum_different_owner,next_n_lines)
- # 去除空元素
- while '' in result:
- result.remove('')
- """写入文件
- """
- if result!=[]:
- out_f.write('\n'.join(result))
- out_f.write('\n')
- circle = circle + total_file_process
- if circle % 5000 == 0:
- t2 = time.time()
- print('已处理%s个!!!花费时长%s!!!'%(str(circle),str(t2-t1)))
- t1 = time.time()
- if __name__ == "__main__":
- input_file_name = '../data/carnum_model.txt'
- output_file_name = '../data/output_carnum_result.txt'
- deal_with_file(input_file_name, output_file_name, 20, 100, 1)
参考文献
放一篇参考文章,我感觉还是写得很不错的:https://www.cnblogs.com/fnng/p/3670789.html
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论