36. Python 多進程

多進程概念:

進程是程序在計算機上的一次執行活動。當你運行一個程序,你就啓動了一個進程。顯然,程序是死的(靜態的),進程是活的(動態的)。進程可以分爲系統進程和用戶進程。凡是用於完成操作系統的各種功能的進程就是系統進程,它們就是處於運行狀態下的操作系統本身;用戶進程就不必我多講了吧,所有由你啓動的進程都是用戶進程。進程是操作系統進行資源分配的單位。

它的思想簡單介紹如下:在操作系統的管理下,所有正在運行的進程輪流使用CPU,每個進程允許佔用CPU的時間非常短(比如10毫秒),這樣用戶根本感覺不出來CPU是在輪流爲多個進程服務,就好象所有的進程都在不間斷地運行一樣。但實際上在任何一個時間內有且僅有一個進程佔有CPU。

#多進程允許我們充分的利用cpu

多進程和多線程的區別:

多進程使用的是CPU的多個核,適合運算密集型

充分利用多個CPU跑進程,系統執行率會更高

進程的範圍比線程的範圍大,進程是相互獨立的個體,一個進程掛了,不會影響其他進程的使用。

多線程使用的是CPU的一個核,適合IO密集型

線程是屬於進程下面的,線程之間存在共享資源,當一個線程掛了,會導致相關的線程掛掉。

組件:

multiprocess模塊

支持創建子進程,通信,共享數據,執行不同形式的同步,提供Process(創建子進程)、Pipe(管道[默認爲雙向,可以單向])、Lock(進程鎖[當一個進程讀文件,會鎖定不讓其他進程讀,當這個進程讀完,會解開鎖,讓其他進程讀文件])等組件。


多進程 multiprocess模塊方法:

import multiprocessing
p = multiprocessing.cpu_count()		#統計cpu的個數
m = multiprocessing.active_children()	#統計存在的子進程
print (p)
print (m)


常用的進程方法:

is_alive()           判斷進程是否存活

run() 啓動進程

start() 啓動進程,會自動調用run方法,這個常用

join(timeout) 等待進程結束或者直到超時

常用的屬性:

name 進程名字

pid 進程的pid

import multiprocessing
import time

def worker_1(interval):
    time.sleep(interval)
    print ("hello world")
    
if __name__ == "__main__":
    c = multiprocessing.Process(target=worker_1, args=(5,))
           #target 代表目標函數名字,沒有括號
           #args 代表worker_1所需要的參數,args所接收的參數類型是tuple,單元素要加逗號
    c.start()                  	#啓動進程
    print (c.is_alive())       	#確定進程是否存活
    c.join(timeout=1)          #等待子進程執行完畢,或者超時退出
    print ("end main")



多進程實例:

import time
import multiprocessing

def worker(name, interval):
    print ("work {0} start".format(name))
    time.sleep(interval)
    print ("work {0} end".format(name))
    
if __name__ == "__main__":
    print ("main start")
    print ("統計cpu有{0}核").format(multiprocessing.cpu_count())
    p1 = multiprocessing.Process(target=worker, args=("worker1", 2))
    p2 = multiprocessing.Process(target=worker, args=("worker2", 3))
    p3 = multiprocessing.Process(target=worker, args=("worker3", 4))
    p1.start()
    p2.start()
    p3.start()
    for p in multiprocessing.active_children():
        print ("pid名稱{0},pid號{1}".format(p.name, p.pid))
    print("main end")

打印結果:

main start

統計cpu有4核

pid名稱Process-1,pid號6388

pid名稱Process-3,pid號3176

pid名稱Process-2,pid號1268

main end

work worker1 start

work worker3 start                  ## p1,p2,p3啓動以後都是獨立運行的,先後可以不是順序,有的啓動快,有的啓動慢

work worker2 start

work worker1 end

work worker2 end

work worker3 end                  ## 關閉進程必須按照啓動的順序P1,P2,P3的順序。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章