python多进程怎样创建,与多线程相比性能如何
Admin 2022-11-01 群英技术资讯 736 次浏览
这篇文章给大家分享的是“python多进程怎样创建,与多线程相比性能如何”,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下吧。创建进程和创建线程的方法基本一致,请看下面代码:
# 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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
时间戳又被称之为是Unix时间戳,原本是在Unix系统中的计时工具。它的含义是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。UNIX时间戳的 0 按照ISO 8601规范为 :1970-01-01T00:00:00Z。
这篇文章主要介绍了Python中五种实现字符串反转的方法,编写一个函数,其作用是将输入的字符串反转过来。下面文章关于其详细介绍,需要的小伙伴可以参考一下
一年一度的六一儿童节又来了,祝大朋友小朋友节日快乐!本文主要介绍如何运用Python中的turtle库控制函数绘制可达鸭,希望你会喜欢
这篇文章主要介绍了Python字符集和字符编码详情,Python中的字符串是通过unicode来表示的,在底层对应的结构体是PyUnicodeObject,但是具体为什么呢?带着疑问一起学习下面文章内容吧
这篇文章主要给大家分享了python内存泄漏排查技巧总结,工作过程中服务难免遇到内存泄漏问题,下面文章就给大家总结一些排查下技巧,具有一定的参考价值,需要的朋友可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008