python實現(xiàn)通過隊列完成進程間的多任務功能示例
本文實例講述了python實現(xiàn)通過隊列完成進程間的多任務功能。分享給大家供大家參考,具體如下:
1.通過隊列完成進程間的多任務
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
在程序實際處理問題過程中,忙時會有成千上萬的任務需要被執(zhí)行,閑時可能只有零星任務。那么在成千上萬個任務需要被執(zhí)行的時候,我們就需要去創(chuàng)建成千上萬個進程么?首先,創(chuàng)建進程需要消耗時間,銷毀進程也需要消耗時間。第二即便開啟了成千上萬的進程,操作系統(tǒng)也不能讓他們同時執(zhí)行,這樣反而會影響程序的效率。因此我們不能無限制的根據(jù)任務開啟或者結束進程。那么我們要怎么做呢?
在這里,要給大家介紹一個進程池的概念,定義一個池子,在里面放上固定數(shù)量的進程,有需求來了,就拿一個池中的進程來處理任務,等到處理完畢,進程并不關閉,而是將進程再放回進程池中繼續(xù)等待任務。如果有很多任務需要執(zhí)行,池中的進程數(shù)量不夠,任務就要等待之前的進程執(zhí)行任務完畢歸來,拿到空閑進程才能繼續(xù)執(zhí)行。也就是說,池中進程的數(shù)量是固定的,那么同一時間最多有固定數(shù)量的進程在運行。這樣不會增加操作系統(tǒng)的調(diào)度難度,還節(jié)省了開閉進程的時間,也一定程度上能夠實現(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----")
# 關閉進程池,關閉后po不再接受新的請求
po.close()
# 等待po中所有子進程執(zhí)行完成,必須放在close語句之后
po.join()
print("----end----")
if __name__ == '__main__':
main()

更多關于Python相關內(nèi)容感興趣的讀者可查看本站專題:《Python進程與線程操作技巧總結》、《Python數(shù)據(jù)結構與算法教程》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》、《Python+MySQL數(shù)據(jù)庫程序設計入門教程》及《Python常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家Python程序設計有所幫助。
相關文章
Python使用urllib2獲取網(wǎng)絡資源實例講解
urllib2是Python的一個獲取URLs(Uniform Resource Locators)的組件。他以urlopen函數(shù)的形式提供了一個非常簡單的接口,下面我們用實例講解他的使用方法2013-12-12
Python遠程方法調(diào)用實現(xiàn)過程解析
這篇文章主要介紹了Python遠程方法調(diào)用實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07
Python計數(shù)器collections.Counter用法詳解
本文主要介紹了Python計數(shù)器collections.Counter用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03
如何在pyqt中實現(xiàn)全局事件實戰(zhàn)記錄
事件的處理機制非常的復雜,屬于PyQt底層的事,不必我們關心,學會使用就行,下面這篇文章主要給大家介紹了關于如何在pyqt中實現(xiàn)全局事件的相關資料,需要的朋友可以參考下2022-02-02
Python常見MongoDB數(shù)據(jù)庫操作實例總結
這篇文章主要介紹了Python常見MongoDB數(shù)據(jù)庫操作,結合實例形式詳細總結了Python針對MongoDB數(shù)據(jù)庫相關pymongo庫安裝以及MongoDB數(shù)據(jù)庫的增刪改查等相關操作技巧與注意事項,需要的朋友可以參考下2018-07-07
python+pyhyper實現(xiàn)識別圖片中的車牌號思路詳解
最近領導給布置了一個基于圖片識別車牌號的工具開發(fā)任務,然后就去研究實現(xiàn)邏輯,自己根據(jù)opencv寫了一個小demo,發(fā)現(xiàn)不僅速度慢而且成功率極低。然后,就找到了Hyperlpr開源項目,這篇文章主要介紹了python+pyhyper實現(xiàn)識別圖片中的車牌號,需要的朋友可以參考下2022-12-12
以一個投票程序的實例來講解Python的Django框架使用
這篇文章主要介紹了以一個投票程序的實例來講解Python的Django框架使用,Django是Python世界中人氣最高的MVC框架,需要的朋友可以參考下2016-02-02
Python搭建代理IP池實現(xiàn)接口設置與整體調(diào)度
這篇文章主要介紹了Python搭建代理IP池實現(xiàn)接口設置與整體調(diào)度,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10
Python實現(xiàn)類的創(chuàng)建與使用方法示例
這篇文章主要介紹了Python實現(xiàn)類的創(chuàng)建與使用方法,結合簡單計算器功能實例分析了Python類的定義與使用方法,需要的朋友可以參考下2017-07-07

