python實(shí)現(xiàn)通過(guò)隊(duì)列完成進(jìn)程間的多任務(wù)功能示例
本文實(shí)例講述了python實(shí)現(xiàn)通過(guò)隊(duì)列完成進(jìn)程間的多任務(wù)功能。分享給大家供大家參考,具體如下:
1.通過(guò)隊(duì)列完成進(jìn)程間的多任務(wù)
import multiprocessing
def download_data(q):
"""下載數(shù)據(jù)"""
# 模擬從網(wǎng)上下載數(shù)據(jù)
data = [11, 22, 33, 44]
# 向隊(duì)列中寫(xiě)入數(shù)據(jù)
for temp in data:
q.put(temp)
print("----數(shù)據(jù)下載完成并且已存入隊(duì)列----")
def analysis_data(q):
"""數(shù)據(jù)處理"""
waitting_analysis_data = list()
# 從隊(duì)列中獲取數(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)建一個(gè)隊(duì)列
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.進(jìn)程池pool
在程序?qū)嶋H處理問(wèn)題過(guò)程中,忙時(shí)會(huì)有成千上萬(wàn)的任務(wù)需要被執(zhí)行,閑時(shí)可能只有零星任務(wù)。那么在成千上萬(wàn)個(gè)任務(wù)需要被執(zhí)行的時(shí)候,我們就需要去創(chuàng)建成千上萬(wàn)個(gè)進(jìn)程么?首先,創(chuàng)建進(jìn)程需要消耗時(shí)間,銷(xiāo)毀進(jìn)程也需要消耗時(shí)間。第二即便開(kāi)啟了成千上萬(wàn)的進(jìn)程,操作系統(tǒng)也不能讓他們同時(shí)執(zhí)行,這樣反而會(huì)影響程序的效率。因此我們不能無(wú)限制的根據(jù)任務(wù)開(kāi)啟或者結(jié)束進(jìn)程。那么我們要怎么做呢?
在這里,要給大家介紹一個(gè)進(jìn)程池的概念,定義一個(gè)池子,在里面放上固定數(shù)量的進(jìn)程,有需求來(lái)了,就拿一個(gè)池中的進(jìn)程來(lái)處理任務(wù),等到處理完畢,進(jìn)程并不關(guān)閉,而是將進(jìn)程再放回進(jìn)程池中繼續(xù)等待任務(wù)。如果有很多任務(wù)需要執(zhí)行,池中的進(jìn)程數(shù)量不夠,任務(wù)就要等待之前的進(jìn)程執(zhí)行任務(wù)完畢歸來(lái),拿到空閑進(jìn)程才能繼續(xù)執(zhí)行。也就是說(shuō),池中進(jìn)程的數(shù)量是固定的,那么同一時(shí)間最多有固定數(shù)量的進(jìn)程在運(yùn)行。這樣不會(huì)增加操作系統(tǒng)的調(diào)度難度,還節(jié)省了開(kāi)閉進(jìn)程的時(shí)間,也一定程度上能夠?qū)崿F(xiàn)并發(fā)效果。
案例:
from multiprocessing import Pool
import os, time, random
def worker(msg):
t_start = time.time()
print("進(jìn)程%s開(kāi)始執(zhí)行,進(jìn)程號(hào)為%d" % (msg, os.getpid()))
# random.random()隨機(jī)生成0-1之間的浮點(diǎn)數(shù)
time.sleep(random.random()*2)
t_stop = time.time()
print("進(jìn)程",msg,"執(zhí)行完成,耗時(shí)%0.2f" % (t_stop-t_start))
def main():
# 定義一個(gè)進(jìn)程池,最大進(jìn)程數(shù)為3
po = Pool(3)
for i in range(10):
# Pool().apply_async(要調(diào)用的目標(biāo),(傳遞給目標(biāo)的參數(shù)元組,))
# 每次循環(huán)將會(huì)用空閑出來(lái)的子進(jìn)程去調(diào)用目標(biāo)
po.apply_async(worker,(i,))
print("----start----")
# 關(guān)閉進(jìn)程池,關(guān)閉后po不再接受新的請(qǐng)求
po.close()
# 等待po中所有子進(jìn)程執(zhí)行完成,必須放在close語(yǔ)句之后
po.join()
print("----end----")
if __name__ == '__main__':
main()

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

