赞
踩
every blog every motto: Light tomorrow with today.
因为最近在写有关多进程返回值的问题,涉及到这方面,索性进行简单的小结
说明: 其中有关函数计时用到了装饰器,可参考装饰器及文末的参考文章
说明:
下表为对同一段程序进行10次运行以后的平均时间(单位:秒)。
多进程方法均在multiprocessing中,
方法 | Pool | pool.Pool | pool.ThreadPool |
---|---|---|---|
apply | 3.722 | 3.774 | 1.748 |
apply_async | 1.868 | 1.926 | 0.863 |
注:
补充时间:2020.8.10.16:47
在实际运行用中发现有意思的现象,准确说和本文得出的结论恰恰相反,遂记之。
方法 | Pool | pool.Pool | pool.ThreadPool |
---|---|---|---|
apply | 98~ | 99~ | 98~ |
apply_async | 33~ | 34~ | 98~ |
说明:
同样的是,又同段程序测试了如下多进程方法:
时间约为33秒。
process_li = []
# 1. 数据处理,及保存
for file in files:
# 多进程
t = Process(target=preprocessing_data, args=(file,))
t.start()
process_li.append(t)
for i in process_li:
i.join()
补充时间:2020.12.20
直接上结果:
方法 | Pool | pool.Pool | pool.ThreadPool |
---|---|---|---|
apply | 30/29/26 | 38/28/26 | 22/21/22 |
apply_async | 22/23/22 | 21/59/20 | 10/13/15 |
说明:
import time loop_number = 30000 def count_time(func): """装饰器:计算程序运行时间""" def wrapper(*args, **kwargs): t1 = time.time() func(*args, **kwargs) t2 = time.time() # 计算时间 time_consumed = t2 - t1 print('{}函数一共花费了{}秒'.format(func.__name__, time_consumed)) return wrapper def fun(k): """被测试函数""" print('-----fun函数内部,参数为{}----'.format(k)) m = k + 10 return m @count_time def call_fun(): """没有使用多线程的情况""" number = 0 for i in range(loop_number): print('number:{}'.format(number)) number = fun(number) def main(): """主程序""" # 1. 没有使用多线程 call_fun() if __name__ == '__main__': main()
导入模块
from multiprocessing import Pool
描述: apply方法是阻塞的,即等待子进程执行完毕后,再执行下一个子进程。
def fun(k): """被测试函数""" print('-----fun函数内部,参数为{}----'.format(k)) m = k + 10 return m @count_time def my_process(): """多进程""" # 方法一:apply/apply_async pool = Pool(4) # 创建4个进程 k = 0 for i in range(loop_number): pool.apply(fun, args=(k,)) def main(): """主程序""" # 3. 使用多进程 my_process() if __name__ == '__main__': main()
结果:
分别记录10次的时间: 3.717 ,3.689,3.716,3.725,3.653,3.696,3.841,3.698,3.672,3.808
平均时间为:3.722
描述: apply_async是异步非阻塞的,即不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。
import multiprocessing def fun(k): """被测试函数""" print('-----fun函数内部,参数为{}----'.format(k)) m = k + 10 return m @count_time def my_process(): """多进程""" # 方法一:apply/apply_async pool = Pool(4) # 创建4个进程 k = 0 for i in range(loop_number): pool.apply_async(fun, args=(k,)) # ---------------------------- # apply_async为非阻塞式,要加close和join # 行号:007 pool.close() pool.join() # ------------------------------ print('---888---') # 查看主进程运行情况 def main(): """主程序""" # 3. 使用多进程 my_process() if __name__ == '__main__': main()
结果:
小结:
导入模块
from multiprocessing.pool import Pool
其余代码一样,为了查看主进程的运行效果,加了一行打印“----888----",位置位于:
@count_time
def my_process():
"""多进程"""
# 方法一:apply/apply_async
pool =Pool(4) # 创建4个进程
k = 0
for i in range(loop_number):
pool.apply(fun, args=(k,))
# pool.close()
# pool.join()
print('---888---')
说明:因为apply是阻塞式,不需要加以下代码
pool.close()
pool.join()
结果:
分别记录10次的时间: 4.024,3.772,3.617,3.673,3.906,3.890,3.712,3.719,3.668,3.838
平均时间: 3.774
说明: apply_async为非阻塞式,需要加close和join
@count_time
def my_process():
"""多进程"""
# 方法一:apply/apply_async
pool =Pool(4) # 创建4个进程
k = 0
for i in range(loop_number):
pool.apply_async(fun, args=(k,))
pool.close()
pool.join()
print('---888---')
结果:
分别记录10次的时间: 1.866,2.082,1.801,1.858,2.115,1.846,1.857,2.088,1.880,1.868
平均时间: 1.926
仅导入模块和创建进程部分不同,为了方便读者进行测试,此处贴完整代码
from multiprocessing.pool import ThreadPool
def fun(k): """被测试函数""" print('-----fun函数内部,参数为{}----'.format(k)) m = k + 10 return m @count_time def my_process(): """多进程""" # 方法一:apply/apply_async pool =ThreadPool(4) # 创建4个进程 k = 0 for i in range(loop_number): pool.apply(fun, args=(k,)) print('---888---') def main(): """主程序""" # 3. 使用多进程 my_process() if __name__ == '__main__': main()
结果:
分别记录10次的时间: 1.715,1.716,1.715,1.714,1.839,1.815,1.714,1.715,1.826,1.713
平均时间: 1.748
def fun(k): """被测试函数""" print('-----fun函数内部,参数为{}----'.format(k)) m = k + 10 return m @count_time def my_process(): """多进程""" # 方法一:apply/apply_async pool =ThreadPool(4) # 创建4个进程 k = 0 for i in range(loop_number): pool.apply_async(fun, args=(k,)) pool.close() pool.join() print('---888---') def main(): """主程序""" # 3. 使用多进程 my_process() if __name__ == '__main__': main()
结果:
分别记录10次的时间: 0.815,0.818,0.927,0.838,0.923,0.918,0.923,0.824,0.817,0.824
平均时间: 0.863
多进程方法均在multiprocessing中,
方法 | Pool | pool.Pool | pool.ThreadPool |
---|---|---|---|
apply | 3.722 | 3.774 | 1.748 |
apply_async | 1.868 | 1.926 | 0.863 |
由以上表格发现,运行时间相差2倍
建议:使用multiprocessing下的pool.ThreadPool的apply_async方法
知识无价,如果帮助到你,不妨请喝一杯奶茶~~
[1] https://blog.csdn.net/weixin_39190382/article/details/107107980
[2] https://blog.csdn.net/htuhxf/article/details/101221768
[3] https://www.cnblogs.com/wr13640959765/p/9428245.html
[4] https://blog.csdn.net/weixin_43283397/article/details/104294890
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。