<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
現在我們的計算機都是多個核的,通俗來說就是多個處理或者計算單元。為了加快運算和處理速度,我們可以將不同的任務交給多個核心進行同時處理,從而提高了運算速度和效率,多個核心同時運作就是多個程序同時進行,這就是多程序。
建立程序和建立執行緒的方法基本一致,請看下面程式碼:
# 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()
效果圖:
到此這篇關於深入解析Python中的多程序的文章就介紹到這了,更多相關Python多程序內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45