多進(jìn)程(multiprocessing)

import multiprocessing
import os, time


def info(title):
    print(title)
    # time.sleep(1)
    print("Module name:", __name__)
    print("Parent process id:", os.getppid())   #父進(jìn)程id
    print("Current process id:", os.getpid())  #當(dāng)前進(jìn)程id
    print("\n\n")

# if __name__ == "__main__":     #啟動一個子進(jìn)程
#     info("Main process")
#     p = multiprocessing.Process(target=info, args=('Child process',))
#     p.start()

if __name__ == "__main__":     #啟動多個子進(jìn)程(查看結(jié)果)
    info("Main process")
    for i in range(10):
        p = multiprocessing.Process(target=info, args=('Child process %s' %i,))
        p.start()

注意:由于進(jìn)程之間的數(shù)據(jù)需要各自持有一份侍瑟,所以創(chuàng)建進(jìn)程需要的非常大的開銷尉咕。

進(jìn)程間通信

不同進(jìn)程之間內(nèi)存是不共享的,要想實(shí)現(xiàn)兩個進(jìn)程間的數(shù)據(jù)交換樱哼,有以下方法:

進(jìn)程隊列(Queue)

使用方法跟threading里的queue差不多(進(jìn)程Queue使用pickle數(shù)據(jù)傳遞)

import multiprocessing, time

def put_func(qq):
    qq.put([12, None, "hello"])
    # time.sleep(2)
    # print("put:",qq.qsize())

def get_func(qq):
    print(qq.get())

if __name__ == "__main__":
    q = multiprocessing.Queue()         #創(chuàng)建一個進(jìn)程Queue對象
    puter = multiprocessing.Process(target=put_func,args=(q,))    #將Queue對象傳遞到新創(chuàng)建的子進(jìn)程中
    puter.start()

    geter = multiprocessing.Process(target=get_func, args=(q,))
    geter.start()
Pipe

pipe()返回一對連接對象球恤,conn1, conn2代表了pipe的兩端辜昵。每個對象都有send()和recv()方法。

from multiprocessing import Pipe,Process
import time

# a_conn, b_conn = Pipe()
# a_conn.send(['a', 'f', 'e'])
# print(b_conn.recv())

def f(conn):
    time.sleep(2)
    conn.send(['a', 'b', 'c'])

def ff(conn):
    print(conn.recv())

if __name__ == "__main__":
    conn1, conn2 = Pipe()
    p1 = Process(target=f, args=(conn2,))
    p2 = Process(target=ff ,args=(conn1,))
    # p1.daemon = True    # 加上daemon屬性
    # p2.daemon = True
    p1.start()
    p2.start()
Manager

Python實(shí)現(xiàn)多進(jìn)程間通信的方式有很多種咽斧,例如隊列堪置,管道等。但是這些方式只適用于多個進(jìn)程都是源于同一個父進(jìn)程的情況张惹。如果多個進(jìn)程不是源于同一個父進(jìn)程舀锨,只能用共享內(nèi)存,信號量等方式诵叁,但是這些方式對于復(fù)雜的數(shù)據(jù)結(jié)構(gòu)雁竞,例如Queue,dict,list等碑诉,使用起來比較麻煩彪腔,不夠靈活。
Manager是一種較為高級的多進(jìn)程通信方式进栽,它能支持Python支持的的任何數(shù)據(jù)結(jié)構(gòu)德挣。
它的原理是:先啟動一個ManagerServer進(jìn)程,這個進(jìn)程是阻塞的快毛,它監(jiān)聽一個socket格嗅,然后其他進(jìn)程(ManagerClient)通過socket來連接到ManagerServer,實(shí)現(xiàn)通信唠帝。

from multiprocessing import Process, Manager
import os

def f(d, l):
    d[os.getpid()] = os.getpid()
    d[1] = '1'
    l.append(os.getpid())
    print(l)

if __name__ == "__main__":
    with Manager() as manager:    #manager = multiprocessing.Manager()
        d = manager.dict()          ## 生成一個可在多個進(jìn)程間共享和傳遞的字典
        l = manager.list(range(5))  ##生成一個可在多個進(jìn)程間共享和傳遞的列表

        p_list = []
        for i in range(10):
            p = Process(target=f, args=(d, l))
            p.start()
            p_list.append(p)
        for res in p_list:
            res.join()

        print(d)
        print(l)

進(jìn)程池

進(jìn)程池內(nèi)部維護(hù)一個進(jìn)程序列屯掖,當(dāng)使用時,則去進(jìn)程池中獲取一個進(jìn)程襟衰,如果進(jìn)程池序列中沒有可供使用的進(jìn)進(jìn)程贴铜,那么程序就會等待,直到進(jìn)程池中有可用進(jìn)程為止瀑晒。進(jìn)程池設(shè)置最好等于CPU核心數(shù)量

進(jìn)程池中有兩個方法:
? apply 串行
? apply_async

from multiprocessing import Process, Pool
import time, os

def Foo(i):
    time.sleep(2)
    return  i+100

def Bar(arg):
    print(os.getpid())    #使用的主進(jìn)程做的回調(diào)(os.getpid()值是一樣的)
    print(arg)


if __name__ == '__main__':
    pool = Pool(3)       #進(jìn)程池同時可放3個進(jìn)程
    for i in range(10):
        # pool.apply(func=Foo, args=(i,))
        pool.apply_async(func=Foo, args=(i,), callback=Bar)  #callback回調(diào)绍坝,func執(zhí)行完畢后執(zhí)行回調(diào)函數(shù),注意:使用的主進(jìn)程做的回調(diào)

    print('end')
    pool.close()   # 一定要先關(guān)閉進(jìn)程池再join
    pool.join()  #進(jìn)程池中的進(jìn)程執(zhí)行完畢后再關(guān)閉苔悦,如果注釋轩褐,程序就直接關(guān)閉了
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市玖详,隨后出現(xiàn)的幾起案子把介,更是在濱河造成了極大的恐慌,老刑警劉巖竹宋,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劳澄,死亡現(xiàn)場離奇詭異地技,居然都是意外死亡蜈七,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門莫矗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來飒硅,“玉大人,你說我怎么就攤上這事作谚∪洌” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵妹懒,是天一觀的道長雀监。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么会前? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任好乐,我火速辦了婚禮,結(jié)果婚禮上瓦宜,老公的妹妹穿的比我還像新娘蔚万。我一直安慰自己,他們只是感情好临庇,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布反璃。 她就那樣靜靜地躺著,像睡著了一般假夺。 火紅的嫁衣襯著肌膚如雪淮蜈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天已卷,我揣著相機(jī)與錄音礁芦,去河邊找鬼。 笑死悼尾,一個胖子當(dāng)著我的面吹牛柿扣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闺魏,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼未状,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了析桥?” 一聲冷哼從身側(cè)響起司草,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泡仗,沒想到半個月后埋虹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娩怎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年搔课,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片截亦。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡爬泥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出崩瓤,到底是詐尸還是另有隱情袍啡,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布却桶,位于F島的核電站境输,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗅剖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一蛋逾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窗悯,春花似錦区匣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至欺旧,卻和暖如春姑丑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辞友。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工栅哀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人称龙。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓留拾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鲫尊。 傳聞我的和親對象是個殘疾皇子痴柔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

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

  • @(python)[筆記] 目錄 一咳蔚、什么是進(jìn)程 1.1 進(jìn)程的概念 進(jìn)程的概念起源于操作系統(tǒng),是操作系統(tǒng)最核心的...
    CaiGuangyin閱讀 1,254評論 0 9
  • Python 多進(jìn)程 multiprocessing.Pool類詳解 multiprocessing模塊 mult...
    很少更新了閱讀 9,936評論 2 14
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,131評論 30 470
  • 本文是我在學(xué)習(xí) Python 多進(jìn)程過程中的一些總結(jié)搔驼,主要介紹多進(jìn)程的實(shí)現(xiàn)方式以及進(jìn)程間的通信谈火,大體有如下這么幾點(diǎn)...
    柏丘君閱讀 599評論 0 0
  • multiprocessing是一個使用類似于線程模塊的API來支持產(chǎn)卵過程的軟件包。 多處理包提供本地和遠(yuǎn)程并發(fā)...
    xin激流勇進(jìn)閱讀 582評論 0 0