python實現(xiàn)通過隊列完成進程間的多任務(wù)功能示例
本文實例講述了python實現(xiàn)通過隊列完成進程間的多任務(wù)功能。分享給大家供大家參考,具體如下:
1.通過隊列完成進程間的多任務(wù)
import multiprocessing def download_data(q): """下載數(shù)據(jù)""" # 模擬從網(wǎng)上下載數(shù)據(jù) data = [11, 22, 33, 44] # 向隊列中寫入數(shù)據(jù) for temp in data: q.put(temp) print("----數(shù)據(jù)下載完成并且已存入隊列----") def analysis_data(q): """數(shù)據(jù)處理""" waitting_analysis_data = list() # 從隊列中獲取數(shù)據(jù) while True: data = q.get() waitting_analysis_data.append(data) if q.empty(): break print(waitting_analysis_data) def main(): # 1.創(chuàng)建一個隊列 q = multiprocessing.Queue() q1 = multiprocessing.Process(target=download_data, args=(q,)) q2 = multiprocessing.Process(target=analysis_data, args=(q,)) q1.start() q2.start() if __name__ == '__main__': main()
2.進程池pool
在程序?qū)嶋H處理問題過程中,忙時會有成千上萬的任務(wù)需要被執(zhí)行,閑時可能只有零星任務(wù)。那么在成千上萬個任務(wù)需要被執(zhí)行的時候,我們就需要去創(chuàng)建成千上萬個進程么?首先,創(chuàng)建進程需要消耗時間,銷毀進程也需要消耗時間。第二即便開啟了成千上萬的進程,操作系統(tǒng)也不能讓他們同時執(zhí)行,這樣反而會影響程序的效率。因此我們不能無限制的根據(jù)任務(wù)開啟或者結(jié)束進程。那么我們要怎么做呢?
在這里,要給大家介紹一個進程池的概念,定義一個池子,在里面放上固定數(shù)量的進程,有需求來了,就拿一個池中的進程來處理任務(wù),等到處理完畢,進程并不關(guān)閉,而是將進程再放回進程池中繼續(xù)等待任務(wù)。如果有很多任務(wù)需要執(zhí)行,池中的進程數(shù)量不夠,任務(wù)就要等待之前的進程執(zhí)行任務(wù)完畢歸來,拿到空閑進程才能繼續(xù)執(zhí)行。也就是說,池中進程的數(shù)量是固定的,那么同一時間最多有固定數(shù)量的進程在運行。這樣不會增加操作系統(tǒng)的調(diào)度難度,還節(jié)省了開閉進程的時間,也一定程度上能夠?qū)崿F(xiàn)并發(fā)效果。
案例:
from multiprocessing import Pool import os, time, random def worker(msg): t_start = time.time() print("進程%s開始執(zhí)行,進程號為%d" % (msg, os.getpid())) # random.random()隨機生成0-1之間的浮點數(shù) time.sleep(random.random()*2) t_stop = time.time() print("進程",msg,"執(zhí)行完成,耗時%0.2f" % (t_stop-t_start)) def main(): # 定義一個進程池,最大進程數(shù)為3 po = Pool(3) for i in range(10): # Pool().apply_async(要調(diào)用的目標,(傳遞給目標的參數(shù)元組,)) # 每次循環(huán)將會用空閑出來的子進程去調(diào)用目標 po.apply_async(worker,(i,)) print("----start----") # 關(guān)閉進程池,關(guān)閉后po不再接受新的請求 po.close() # 等待po中所有子進程執(zhí)行完成,必須放在close語句之后 po.join() print("----end----") if __name__ == '__main__': main()
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python進程與線程操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》、《Python+MySQL數(shù)據(jù)庫程序設(shè)計入門教程》及《Python常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家Python程序設(shè)計有所幫助。
相關(guān)文章
淺談python 線程池threadpool之實現(xiàn)
這篇文章主要介紹了淺談python 線程池threadpool之實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11在Python中畫圖(基于Jupyter notebook的魔法函數(shù))
這篇文章主要介紹了在Python中畫圖(基于Jupyter notebook的魔法函數(shù)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10Python語言實現(xiàn)獲取主機名根據(jù)端口殺死進程
這篇文章主要介紹了Python語言實現(xiàn)獲取主機名根據(jù)端口殺死進程的相關(guān)資料,需要的朋友可以參考下2016-03-03python四個坐標點對圖片區(qū)域最小外接矩形進行裁剪
在圖像裁剪操作中,opencv和pillow兩個庫都具有相應的函數(shù),如果想要對目標的最小外接矩形進行裁剪該如何操作呢?本文就來詳細的介紹一下2021-06-06弄懂這56個Python使用技巧(輕松掌握Python高效開發(fā))
這篇文章主要介紹了弄懂這56個Python使用技巧(輕松掌握Python高效開發(fā)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-09-09基于Python和openCV實現(xiàn)圖像的全景拼接詳細步驟
這篇文章主要介紹了基于Python和openCV實現(xiàn)圖像的全景拼接,本文分步驟通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2021-10-10舉例詳解Python中的split()函數(shù)的使用方法
這篇文章主要介紹了舉例詳解Python中的split()函數(shù)的使用方法,split()函數(shù)的使用是Python學習當中的基礎(chǔ)知識,通常用于將字符串切片并轉(zhuǎn)換為列表,需要的朋友可以參考下2015-04-04