多進程簡解

多進程
進程:正在執(zhí)行的應(yīng)用程序
多進程:多個運行的應(yīng)用程序

Python多進程開發(fā):內(nèi)建標準模塊multiprocessing
可以通過該模塊的Process進程類型,可以很方便的創(chuàng)建和管理多個進程

常見的multiprocessing屬性和模塊
multiprocessing.Process 進程類型窟勃,用于創(chuàng)建和管理進程
multiprocessing.Lock/RLock 進程互斥鎖/重用鎖掉分, 用于進程同步备图,數(shù)據(jù)鎖
multiprocessing.Event 進程事件類型誉裆,用于進程同步,數(shù)據(jù)信號通信
multiprocessing.Condition 進程條件類型怔揩, 用于進程同步右蕊, 數(shù)據(jù)信號通信
multiprocessing.Queue 進程隊列類型琼稻,用于多進程數(shù)據(jù)共享
multiprocessing.Manager 進程管理類型,專門用于多進程數(shù)據(jù)共享
multiprocessing.Listener/Client 進程監(jiān)聽客戶端饶囚,基于網(wǎng)絡(luò)多進程之間的數(shù)據(jù)共享

多進程的基礎(chǔ)操作及面向?qū)ο蟮膶崿F(xiàn)

#coding:utf-8
import multiprocessing, os

#基于函數(shù)
def my_proc():
    print("第一個獨立的進程帕翻,程序的進程編號:", os.getpid(), os.getppid())

def my_proc2(name):
    print(name, "第二個獨立的進程,程序的進程編號:", os.getpid(), os.getppid())


#基于類型的
class MyProc(multiprocessing.Process):

    def __init__(self, name):
        super().__init__(name=name)

    def run(self):
        print(self.name, "基于類型的進程執(zhí)行", os.getpid(),self.ident, os.getppid())


if __name__ == "__main__":
    #創(chuàng)建基于函數(shù)的多進程
    p1 = multiprocessing.Process(target=my_proc)
    p2 = multiprocessing.Process(target=my_proc)
    #啟動進程
    p1.start()
    p2.start()

    #基于函數(shù)的萝风,添加參數(shù)之后的多進程
    p11 = multiprocessing.Process(target=my_proc2, args=('tom',))#元組中若只有一個元素嘀掸,則必須帶逗號!
    p12 = multiprocessing.Process(target=my_proc2, args=('jerry',))#元組中若只有一個元素规惰,則必須帶逗號睬塌!
    #啟動進程
    p11.start()
    p12.start()
    
    #創(chuàng)建基于類型的多個進程
    p1 = MyProc("進程A")
    p2 = MyProc("進程B")
    #啟動進程
    p1.start()
    p2.start()

多進程的簡化:內(nèi)置進程池
多進程的操作在實際應(yīng)用中也是非常多的,但是純底層的代碼開發(fā)控制并發(fā)也是一件非常繁 瑣的事情歇万,所以就出現(xiàn)了面向過程多進程并發(fā)的優(yōu)化操作方式:進程池 Pool

通過進程池 Pool 可以快速創(chuàng)建多個進程執(zhí)行指定函數(shù)揩晴,完成高并發(fā)處理操作

"""
進程池
"""
#引入需要的模塊
import multiprocessing, os, time

#創(chuàng)建程序函數(shù)
def my_proc():
    print(multiprocessing.current_process().name, "一個進程正在執(zhí)行", os.getpid(), os.getppid())
    time.sleep(1)


if __name__ == "__main__":
    #創(chuàng)建一個進程池
    pool = multiprocessing.Pool(2)  #同時工作的任務(wù)數(shù)

    #循環(huán)任務(wù)
    for i in range(20):  #安排的任務(wù)數(shù)
        pool.apply_async(my_proc)

    #停止提交任務(wù)
    pool.close()

    #獨占執(zhí)行
    pool.join()

簡單案例:多進程下載 有了進程池,可以簡單完成一個多進程任務(wù)下載的操作處理

#模擬下載:通過多進程的方式執(zhí)行
import time
from multiprocessing import current_process, Pool

def download(url):
    #下載函數(shù)
    print(current_process().name, "開始下載數(shù)據(jù)》》》》", url)
    time.sleep(1)
    print(current_process().name, "下載數(shù)據(jù)完成《《《")
    time.sleep(1)
    return "下載號的數(shù)據(jù)"


def sava_data(data):
    print("保存下載的數(shù)據(jù):", data)


if __name__ == "__main__":
    #創(chuàng)建一個進程池
    pool = Pool(5)

    #循環(huán)下載數(shù)據(jù)
    for i in range(20):
        pool.apply_async(download, args=("http://baudu.com",), callback=sava_data)

    #停止提交任務(wù)給進程池
    pool.close()
    #獨占
    pool.join()

多個進程通信:multiprocessing.Manager
不同線程之間的數(shù)據(jù)通信贪磺,涉及到核心的數(shù)據(jù)共享問題硫兰,主要由 PYTHON 中提供的內(nèi)建模 塊 multiprocessing.Manager 類型實現(xiàn),該類型內(nèi)置了大量的用于數(shù)據(jù)共享的操作

multiprocessing.Manager 常見屬性和方法

Array 內(nèi)置進程間共享數(shù)組類型
Queue 內(nèi)置進程間共享隊列類型
list() 內(nèi)置進程間共享列表類型
dict() 內(nèi)置進程間共享字典類型
Value 內(nèi)置進程間共享值類型
Barrier 進程同步類型
BoundedSemaphore| Semaphore 進程信號量類型
Lock|RLock 進程互斥鎖/重用鎖
Event 進程同步事件類型
Condition 進程同步條件類型

import multiprocessing, time, random

#創(chuàng)建一個條件對象
con = multiprocessing.Condition()

#創(chuàng)建籃子
basket = list()

def product():
    while True:
        time.sleep(1)
        #上鎖
        con.acquire()

        if len(basket) > 20:
            print(":籃子滿了寒锚, 快來吃吧")
            con.wait()
        else:
            #生產(chǎn)一個包子
            _no = random.randint(1, 10)
            print("蒸好了一個包子", _no)
            basket.append(_no)
            con.notify()

        #解鎖
        con.release()

def consumer():
    while True:
        time.sleep(0.5)
        #上鎖
        con.acquire()

        if len(basket) <= 0:
            print("吃光了劫映,快上菜吧")
            con.wait()
        else:
            _no = basket.pop()
            print("吃掉了一個包子", _no)
            con.notify()
        #解鎖
        con.release()


if __name__ == "__main__":

    for i in range(5):
        p = multiprocessing.Process(name="生產(chǎn)者" + str(i) + "號", target=product)
        p.start()

    for j in range(5):
        c = multiprocessing.Process(name="消費者" + str(j) + "號", target=consumer)
        c.start()

多個進程通信:multiprocessing.Queue
多個進程之間的通信操作,數(shù)據(jù)的傳遞在 PYTHON 中的 multiprocessing 模塊中提供了一個 專門用于多進程之間進行數(shù)據(jù)傳遞的隊列:Queue

multiprocessing.Queue 常見屬性和方法
put(data [, timeout=None]) 添加一個數(shù)據(jù)到隊列中
put_nowait(data) 添加一個數(shù)據(jù)到隊列中刹前,非阻塞模式
get([timeout=None]) 從隊列中獲取一個數(shù)據(jù)
get_nowait() 從隊列中獲取一個數(shù)據(jù)泳赋,非阻塞模式
full() 判斷隊列是否已滿
empty() 判斷隊列是否已空
close() 關(guān)閉隊列
qsize() 獲取隊列中的元素數(shù)量

引入需要的模塊

import multiprocessing, time, random

#定義一個隊列儲存數(shù)據(jù)
basket = multiprocessing.Queue(20)

def product():

    while True:
        time.sleep(1)
        _no = random.randint(0, 10)
        try:
            basket.put(_no, timeout=1)
            print("生產(chǎn)者生產(chǎn)了一個數(shù)據(jù)", _no)

        except:
            basket.full()
            print("數(shù)據(jù)框滿了")


def consumer():

    while True:
        time.sleep(0.5)
        try:
            _no = basket.get(timeout=1)
            print("消費者取走了一個數(shù)據(jù)", _no)

        except:
            basket.empty()
            print("數(shù)據(jù)框空了")


if __name__ == "__main__":
    for i in range(2):
        p = multiprocessing.Process(target=product)
        p.start()

    for j in range(2):
        c = multiprocessing.Process(target=consumer)
        c.start()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腮郊,隨后出現(xiàn)的幾起案子摹蘑,更是在濱河造成了極大的恐慌筹燕,老刑警劉巖轧飞,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衅鹿,死亡現(xiàn)場離奇詭異,居然都是意外死亡过咬,警方通過查閱死者的電腦和手機大渤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掸绞,“玉大人泵三,你說我怎么就攤上這事∠蔚В” “怎么了烫幕?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長敞映。 經(jīng)常有香客問我较曼,道長,這世上最難降的妖魔是什么振愿? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任捷犹,我火速辦了婚禮,結(jié)果婚禮上冕末,老公的妹妹穿的比我還像新娘萍歉。我一直安慰自己,他們只是感情好档桃,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布枪孩。 她就那樣靜靜地躺著,像睡著了一般藻肄。 火紅的嫁衣襯著肌膚如雪销凑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天仅炊,我揣著相機與錄音斗幼,去河邊找鬼。 笑死抚垄,一個胖子當著我的面吹牛蜕窿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呆馁,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼桐经,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浙滤?” 一聲冷哼從身側(cè)響起阴挣,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纺腊,沒想到半個月后畔咧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茎芭,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年誓沸,在試婚紗的時候發(fā)現(xiàn)自己被綠了梅桩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡拜隧,死狀恐怖宿百,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洪添,我是刑警寧澤垦页,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站干奢,受9級特大地震影響外臂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜律胀,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一宋光、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炭菌,春花似錦罪佳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至克握,卻和暖如春蕾管,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菩暗。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工掰曾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人停团。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓旷坦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親佑稠。 傳聞我的和親對象是個殘疾皇子秒梅,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容