Python多進程

1. 多進程實現(xiàn)斐波那契

對于耗費cpu的操作,多進程由于多線程, 我拿斐波那契進行比較發(fā)現(xiàn)多進程速度遠遠高于多線程

# 多線程
import time
from concurrent.futures import ThreadPoolExecutor, as_completed

def fib(n):
    if n<=2:
        return 1
    return fib(n-1)+fib(n-2)

if __name__ == "__main__":
    with ThreadPoolExecutor(2) as executor:
        all_task = [executor.submit(fib, (num)) for num in range(38)]      # 39s
        start_time = time.time()
        for future in as_completed(all_task):
            data = future.result()
            print("exe result: {}".format(data))

        print("last time is: {}".format(time.time()-start_time))
# 多進程
import time
from concurrent.futures import ThreadPoolExecutor, as_completed


def fib(n):
    if n<=2:
        return 1
    return fib(n-1)+fib(n-2)

if __name__ == "__main__":
    with ProcessPoolExecutor(2) as executor:
        all_task = [executor.submit(fib, (num)) for num in range(38)]      # 19
        start_time = time.time()
        for future in as_completed(all_task):
            data = future.result()
            print("exe result: {}".format(data))

        print("last time is: {}".format(time.time()-start_time))
    start_time = time.time()

2. 使用進程池

import multiprocessing

#多進程編程
import time
def get_html(n):
    time.sleep(n)
    print("sub_progress success")
    return n

if __name__ == "__main__":
pool = multiprocessing.Pool(multiprocessing.cpu_count())
 #使用線程池**********************************************************
    result = pool.apply_async(get_html, args=(3,))
    #等待所有任務完成
    pool.close()
    pool.join()

    print(result.get())   # sub_progress success
                          #3
# ********************************************************************
# imap 會按順序打印
    for result in pool.imap(get_html, [1,5,3]):
        print("{} sleep success".format(result))
# sub_progress success
# 1 sleep success
# sub_progress success
# sub_progress success
# 5 sleep success
# 3 sleep success
# ********************************************************************
# imap_unordered 按時間順序打印
    for result in pool.imap_unordered(get_html, [1,5,3]):
        print("{} sleep success".format(result))

# sub_progress success
# 1 sleep success
# sub_progress success
# 3 sleep success
# sub_progress success
# 5 sleep success

3. 進程使用Queue

進程的Queue在multiprocessing下才好用

import time
from multiprocessing import Process, Queue, Manager, Pool, Pipe
def producer(queue):
    queue.put("a")
    time.sleep(2)

def consumer(queue):
    time.sleep(2)
    data = queue.get()
    print(data)

if __name__=="__main__":
    queue = Queue(10)
    my_producter = Process(target=producer, args=(queue,))
    my_consumer = Process(target=consumer, args=(queue,))
    my_producter.start()
    my_consumer.start()
    my_producter.join()
    my_consumer.join()  # a

4. 共享變量不適用于多進程

#共享全局變量不能適用于多進程編程屡谐,可以適用于多線程
import time
from multiprocessing import Process, Queue, Manager, Pool, Pipe

def producer(a):
    a += 100
    time.sleep(2)

def consumer(a):
    time.sleep(2)
    print(a)

if __name__ == "__main__":
    a = 1
    my_producer = Process(target=producer, args=(a,))
    my_consumer = Process(target=consumer, args=(a,))
    my_producer.start()
    my_consumer.start()
    my_producer.join()
    my_consumer.join()  
    # 1

5. 通過pipe實現(xiàn)進程間通信

# pipe性能高于queue

def producer(pipe):
    pipe.send("fz")


def consumer(pipe):
    print(pipe.recv())


if __name__== "__main__":
    receice_pipe, send_pipe = Pipe()
    # pipe只能適用于兩個進程
    my_producer = Process(target=producer, args=(send_pipe,))
    my_consumer = Process(target=consumer, args=(receice_pipe,))

    my_producer.start()
    my_consumer.start()
    my_producer.join()
    my_consumer.join()
    # fz

6. 兩個進程共同操作一個dict

除了dict managers包下包含了所有python的類型可以選擇

import time
from multiprocessing import Process, Queue, Manager, Pool, Pipe

def add_data(p_dict, key, value):
    p_dict[key]=value

if __name__=="__main__":
    progress_dict = Manager().dict()

    first_progress = Process(target=add_data, args=(progress_dict, "fz",21))
    second_progress = Process(target=add_data, args=(progress_dict, "xk",19))

    first_progress.start()
    second_progress.start()
    first_progress.join()
    second_progress.join()
    print(progress_dict)
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末皮仁,一起剝皮案震驚了整個濱河市籍琳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贷祈,老刑警劉巖趋急,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異势誊,居然都是意外死亡呜达,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門粟耻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來查近,“玉大人漩怎,你說我怎么就攤上這事∴挛耍” “怎么了勋锤?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侥祭。 經常有香客問我叁执,道長,這世上最難降的妖魔是什么矮冬? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任谈宛,我火速辦了婚禮,結果婚禮上胎署,老公的妹妹穿的比我還像新娘吆录。我一直安慰自己,他們只是感情好琼牧,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布恢筝。 她就那樣靜靜地躺著,像睡著了一般巨坊。 火紅的嫁衣襯著肌膚如雪撬槽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天趾撵,我揣著相機與錄音侄柔,去河邊找鬼。 笑死占调,一個胖子當著我的面吹牛暂题,可吹牛的內容都是我干的。 我是一名探鬼主播究珊,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼薪者,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了苦银?” 一聲冷哼從身側響起啸胧,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幔虏,沒想到半個月后纺念,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡想括,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年陷谱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡烟逊,死狀恐怖渣窜,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情宪躯,我是刑警寧澤乔宿,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站访雪,受9級特大地震影響详瑞,放射性物質發(fā)生泄漏。R本人自食惡果不足惜臣缀,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一坝橡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧精置,春花似錦计寇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至狼讨,卻和暖如春贝淤,著一層夾襖步出監(jiān)牢的瞬間柒竞,已是汗流浹背政供。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留朽基,地道東北人布隔。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像稼虎,于是被迫代替她去往敵國和親衅檀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容

  • 進程進程的概念是需要理解的杉适,進程是操作系統(tǒng)中正在運行的一個程序實例,操作系統(tǒng)通過進程操作原語來對其進行調度柳击。操作系...
    zhile_doing閱讀 490評論 0 0
  • 1.進程和線程 1.1系統(tǒng)多任務機制 多任務操作機制的引入主要是在相同的硬件資源下怎么提高任務處理效率的猿推!多任務的...
    _寧采臣閱讀 978評論 0 6
  • 多進程 要讓python程序實現(xiàn)多進程,我們先了解操作系統(tǒng)的相關知識。 Unix蹬叭、Linux操作系統(tǒng)提供了一個fo...
    蓓蓓的萬能男友閱讀 595評論 0 1
  • 1.1 線程 線程是一個基本的 CPU 執(zhí)行單元藕咏,它必須依托于進程存活。一個線程是一個execution c...
    lijun_m閱讀 418評論 0 1
  • 進程是正在執(zhí)行中的應用程序秽五,一個進程包含了該應用程序的所有信息孽查。計算機中多線程的操作已經可以實現(xiàn)多人物的處理機制了...
    阿貓阿狗py閱讀 1,629評論 0 0