python多进程怎样创建,与多线程相比性能如何
Admin 2022-11-01 群英技术资讯 289 次浏览
创建进程和创建线程的方法基本一致,请看下面代码:
# coding:utf-8 # 导入多进程的包,并重命名为mp import multiprocessing as mp # 主要工作 def p1(): print("zxy") if __name__ == "__main__": # 创建新进程 new_process = mp.Process(target=p1, name="p1") # 启动这个进程 new_process.start() # 阻塞该进程 new_process.join()
控制台效果图:
为什么要在多进程中使用queue呢?
因为多进程和多线程一样,在工作函数中,无法通过return返回进程函数中的结果,所以使用queue进行存储结果,要用的时候再进行取出。
# coding:utf-8 import time import multiprocessing as mp """ 使用多进程时,运行程序所用的时间 """ def job1(q): res = 0 for i in range(100): res += i + i**5 +i**8 time.sleep(0.1) # 将结果放入队列中 q.put(res) def job2(q): res = 0 for i in range(100): res += i + i**5 +i**8 time.sleep(0.1) q.put(res) if __name__ == "__main__": start_time = time.time() # 创建队列 q = mp.Queue() # 创建进程1 process1 = mp.Process(target=job1, args=(q,)) # 创建进程2 process2 = mp.Process(target=job2, args=(q,)) process1.start() process2.start() # 通过队列获取值 res1 = q.get() res2 = q.get() print("res1为%d,res2为%d" % (res1, res2)) end_time = time.time() print("整个过程所用时间为%s" %(end_time-start_time))
效果图:
接下来使用多进程、多线程、以及什么都不用的普通方法进行处理,看看他们三种方法的效率如何?
# coding:utf-8 import multiprocessing as mp import time import threading as th """ 多进程、多线程、普通方法的性能比较 """ # 多进程工作 def mp_job(res): for i in range(10000000): res += i**5 + i**6 print(res) # 多线程工作 def mt_job(res): for i in range(10000000): res += i**5 + i**6 print(res) # 普通方法工作 def normal_job(res): for i in range(10000000): res += i ** 5 + i ** 6 print(res) if __name__ == "__main__": mp_sum = 0 mp_start = time.time() process1 =mp.Process(target=mp_job, args=(mp_sum, )) process2 = mp.Process(target=mp_job, args=(mp_sum,)) process1.start() process2.start() process1.join() process2.join() mp_end = time.time() print("多进程使用时间为", (mp_end-mp_start)) mt_start = time.time() mt_sum = 0 thread1 = th.Thread(target=mt_job, args=(mt_sum, )) thread2 = th.Thread(target=mt_job, args=(mt_sum, )) thread1.start() thread2.start() thread1.join() thread2.join() mt_end = time.time() print("多线程使用的时间是", (mt_end-mt_start)) normal_start = time.time() normal_sum = 0 # 进行两次 normal_job(normal_sum) normal_job(normal_sum) normal_end = time.time() print("普通方法使用的时间是", (normal_end-normal_start))
效果图:
实验结果表明:多进程的效率确实高!!!
进程池是干什么用的呢?
进程池就是python的多进程提供的一个池子,将所有的进程都放在这个池子里面,让计算机自己去使用进程池中的资源,从而多进程处理一些程序,进而提高工作效率。
(1)默认使用进程池中全部进程时
# coding:utf-8 import time import multiprocessing as mp """ 进程池pool的使用 """ def job(num): time.sleep(1) return num * num if __name__ == "__main__": start_time = time.time() # 括号里面不加参数时,默认使用进程池中所有进程 pool = mp.Pool() res = pool.map(job, range(10)) print(res) end_time = time.time() print("运行时间为", (end_time-start_time))
效果图:
(2)指定进程池中进程数时
# coding:utf-8 import time import multiprocessing as mp """ 进程池pool的使用 """ def job(num): time.sleep(1) return num * num if __name__ == "__main__": start_time = time.time() # 括号里面加参数时,指定两个进程进行处理 pool = mp.Pool(processes=2) res = pool.map(job, range(10)) print(res) end_time = time.time() print("运行时间为", (end_time-start_time))
效果图:
(3)不使用多进程时
# coding:utf-8 import time def job(res): for i in range(10): res.append(i*i) time.sleep(1) if __name__ == "__main__": start_time = time.time() res = [] job(res) print(res) end_time =time.time() print("不使用进程池所用时间为", (end_time-start_time))
效果图:
实验结论:多进程处理事情,效率很高!!!核心越多,处理越快!
一个核心,我们多线程处理时,可以使用全局变量来共享数据。但是多进程之间是不行的,那我们多进程之间应该如何共享数据呢?
那就得用到共享内存了!
# coding:utf-8 import multiprocessing as mp """ 共享内存 """ if __name__ == "__main__": # 第一个参数是数据类型的代码,i代表整数类型 # 第二个参数是共享数据的值 v = mp.Value("i", 0)
进程锁和线程锁的用法基本一致。进程锁的诞生是为了避免多进程之间抢占共享数据,进而造成多进程之间混乱修改共享内存的局面。
(1)不加锁之前
# coding:utf-8 import multiprocessing as mp import time """ 进程中的锁lock """ def job(v, num): for i in range(10): v.value += num print(v.value) time.sleep(0.2) if __name__ == "__main__": # 多进程中的共享内存 v = mp.Value("i", 0) # 进程1让共享变量每次加1 process1 = mp.Process(target=job, args=(v, 1)) # 进程2让共享变量每次加3 process2 = mp.Process(target=job, args=(v, 3)) process1.start() process2.start()
效果图:
(2)加锁之后
# coding:utf-8 import multiprocessing as mp import time """ 进程中的锁lock """ def job(v, num, l): # 加锁 l.acquire() for i in range(10): v.value += num print(v.value) time.sleep(0.2) # 解锁 l.release() if __name__ == "__main__": # 创建进程锁 l = mp.Lock() # 多进程中的共享内存 v = mp.Value("i", 0) process1 = mp.Process(target=job, args=(v, 1, l)) process2 = mp.Process(target=job, args=(v, 3, l)) process1.start() process2.start()
效果图:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
数据清洗是整个数据分析过程的第一步,就像做一道菜之前需要先择菜洗菜一样。 数据分析师经常需要花费大量的时间来清洗数据或者转换格式,这个工作甚至会占整个数据分析流程的80%左右的时间。今天,就来学习一下Python的数据清洗吧!
这篇文章主要介绍python多线程和多进程,很多新手对于进程和线程的区别不是很了解,下文实例对大家学习python线程和进程有一定的参考价值,感兴趣的朋友不妨继续往下看,希望大家阅读完这篇文章能有所收获,接下来小编带着大家一起了解看看。
动机Python进行商业开发时, 需要有一定的安全意识, 为了不被轻易的逆向 混淆和加密就有所必要了 混淆为了增加代码阅读的难度, 源代码
在实际的算法与程序开发中,经常需要面对的场景就是对同一目录内的文件进行批量操作。并且很多时候目录中的文件明明是有规律的,同时希望程序在进行处理时也是按照一定的顺序进行。
大家好啊!我用Tkinter写了一个天气预报小工具,支持34个省级行政区以及港澳台地区天气,覆盖全面。程序打包好放在了蓝奏云,与大家分享一下。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008