Python多进程用法

王 茂南 2018年6月9日17:57:05
评论
3664字阅读12分12秒
摘要Python的基础教程虽说已经有了总结,但是还是会有补充。最近接触了一些关于多进程的用法,在这里记录一下。

前言

这一篇文章记录一下Python的多进程的用法,会举两个例子来说明一下。

这两个例子都会要求输入多个参数,我分别提供了两种解决的方法,分别是使用starmap把参数作为一个数组进行传入

举例

例子一

第一个例子是使用starmap传入多个参数。下面就直接贴代码了,注释写得很明白了。

  1. import multiprocessing
  2. import time
  3. def SaySomething(blessing,name):
  4.     time.sleep(1)
  5.     print(time.ctime()) # 打印程序开始运行的时间
  6.     return blessing + ',' + name
  7. """传入多个参数,并且返回值
  8. """
  9. p = multiprocessing.Pool(2) #初始化一个2个进程的进程池
  10. # 传入多个参数的构造(扩展为多个参数)
  11. blessings = ['Good Night','Have a good dream']
  12. names = ['Zq','WMN7']
  13. par_lists = [[blessings[i],names[i]] for i in range(len(names))] # 构造参数
  14. rslt = p.starmap(SaySomething,par_lists) # 进行多线程运算
  15. # 直接的写法
  16. # rslt = p.starmap(test,(['Good Night','Zq'],['Good Night','WMN7']))
  17. print('多进程返回值 : ',rslt)

程序返回:

  1. >> Thu Jun  7 18:01:24 2018
  2. >> Thu Jun  7 18:01:24 2018
  3. >> 多进程返回值 :  ['Good Night,Zq', 'Have a good dream,WMN7']

可以看到这两次函数的调用是在同一时间启动的。

例子二

这一个例子是通过列表(list)传入多个参数的:

  1. import multiprocessing
  2. import time
  3. # 多个参数通过列表传入
  4. def SaySomethingOne(thing):
  5.     blessing = thing[0]
  6.     name = thing[1]
  7.     time.sleep(1)
  8.     print(time.ctime()) # 打印程序开始运行的时间
  9.     return blessing + ',' + name
  10. # 使用多进程进行计算
  11. p = multiprocessing.Pool(2) #初始化一个2个进程的进程池
  12. # 传入多个参数的构造(扩展为多个参数)
  13. blessings = ['Good Night','Have a good dream']
  14. names = ['Zq','WMN7']
  15. par_lists = [[blessings[i],names[i]] for i in range(len(names))] # 构造参数
  16. rslt = p.map(SaySomethingOne,par_lists) # 进行多线程运算
  17. # 直接的写法
  18. # rslt = p.starmap(test,(['Good Night','Zq'],['Good Night','WMN7']))
  19. print('多进程返回值 : ',rslt)
  20. # 使用单进程进行计算
  21. print('下面使用单进程进行运算进行对比 : ')
  22. rslt = map(SaySomethingOne,par_lists)
  23. for i in rslt:
  24.     print(i)

我们看一下最后的输出:

  1. >> Thu Jun  7 18:06:34 2018
  2. >> Thu Jun  7 18:06:34 2018
  3. >> 多进程返回值 :  ['Good Night,Zq', 'Have a good dream,WMN7']
  4. >> 下面使用单进程进行运算进行对比 :
  5. >> Thu Jun  7 18:06:35 2018
  6. >> Good Night,Zq
  7. >> Thu Jun  7 18:06:36 2018
  8. >> Have a good dream,WMN7

可以看到使用多进程是在同一时间启动的,上面的时间都是 Thu Jun  7 18:06:34 2018,下面单线程是分别进行启动的,可以看到时间是差了1秒,因为我们在上面有time.sleep(1)

一个处理文件的例子

下面是一个使用多进程处理文件的例子,每次读取文件的n行进行处理;主要看deal_with_file这个函数。

  1. import time
  2. from multiprocessing import Pool
  3. from itertools import islice
  4. from similarity_plate_model import deal_with_content
  5. from carNum_model import same_carNum_different_owner
  6. def deal_with_file(input_file, output_file='output.txt',process=10,total_file_process=10, type=0):
  7.     """处理文件,负责输入和输出,使用多进程进行操作
  8.     """
  9.     print('输入文件名称 : ',input_file)
  10.     print('输出文件名称 : ',output_file)
  11.     print('开启进程个数 : ',process)
  12.     pool = Pool(processes=process) # 进程个数
  13.     circle = 0
  14.     t1 = time.time()
  15.     with open(input_file,'r') as in_f, open(output_file,'w') as out_f:
  16.         while True:
  17.             """每次同时处理total_file_process行
  18.             """
  19.             next_n_lines = list(islice(in_f, total_file_process))
  20.             if not next_n_lines:
  21.                 break
  22.             else:
  23.                 if type==0:
  24.                     """对next_n_lines执行deal_with_content函数
  25.                     """
  26.                     result = pool.map(deal_with_content,next_n_lines)
  27.                 elif type==1:
  28.                     result = pool.map(same_carNum_different_owner,next_n_lines)
  29.                 # 去除空元素
  30.                 while '' in result:
  31.                     result.remove('')
  32.                 """写入文件
  33.                 """
  34.                 if result!=[]:
  35.                     out_f.write('\n'.join(result))
  36.                     out_f.write('\n')
  37.                 circle = circle + total_file_process
  38.                 if circle % 5000 == 0:
  39.                     t2 = time.time()
  40.                     print('已处理%s个!!!花费时长%s!!!'%(str(circle),str(t2-t1)))
  41.                     t1 = time.time()
  42. if __name__ == "__main__":
  43.     input_file_name = '../data/carnum_model.txt'
  44.     output_file_name = '../data/output_carnum_result.txt'
  45.     deal_with_file(input_file_name, output_file_name, 20, 100, 1)

 

参考文献

放一篇参考文章,我感觉还是写得很不错的:https://www.cnblogs.com/fnng/p/3670789.html

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2018年6月9日17:57:05
  • 转载请务必保留本文链接:https://mathpretty.com/9400.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: