Python——程式、執行緒、協程、多程式、多執行緒(個人向)

str_lyc發表於2020-10-22

一、程式 執行緒 協程

1.程式

一個執行的程式就是一個程式,沒有執行的程式碼叫做程式。
程式是系統分配資源的最小單位,程式擁有自己獨立的記憶體空間 相對獨立,所以程式間的資料不共享,開銷大。

2.執行緒

CPU排程執行的最小單位(程式真正執行的時候呼叫的是執行緒),也叫執行路徑,依賴於程式存在,
一個程式最小存在一個執行緒,叫做主執行緒
而多個執行緒共享程式記憶體資源(資料共享,共享全域性變數),從而極大地提高了程式的執行效率。

一個程式中可以有一個或多個執行緒。一個執行緒只屬於一個程式。
一個程式中的多個執行緒是一種競爭關係。

3.協程

是一種使用者態的輕量級執行緒,協程的排程完全由使用者控制。
協程擁有自己的暫存器上下文和棧。 協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧,直接操作棧則基本沒有核心切換的開銷,可以不加鎖的訪問全域性變數,所以上下文的切換非常快。	

二、多程式 多執行緒

1.多程式

(並行:兩個人每個人同時處理一個任務)

多程式模組:multiprocessing ,CPU密集型、IO計算型可以使用多程式
多程式的處理
Process建立程式

Process([group [, target [, name [, args [, kwargs]]]]])

target:如果傳遞了函式的引用,可以讓這個子程式就執行函式中的程式碼
args:給 target 指定的函式傳遞的引數,以元組的形式進行傳遞
kwargs:給 target 指定的函式傳遞引數,以字典的形式進行傳遞
name:給程式設定一個名字,可以省略
group:指定程式組,大多數情況下用不到

常用方法:

start():啟動子程式例項(建立子程式)
is_alive():判斷程式子程式是否還在活著
terminate():不管任務是否完成,立即終止子程式Process 建立的例項物件的常用屬性:
name:當前程式的別名,預設為 Process-N,N 為從 1 開始遞增的整數
pid:當前程式的 pid(程式號)
import time
from multiprocessing import Process

def download1(name):
    for i in range(1, 6):
        print(f'{name}下載進度:{i * 20}%')
        time.sleep(1)
        
def download2(name):
    for i in range(1, 6):
        print(f'{name}下載進度:{i * 20}%')
        time.sleep(1)

if __name__ == '__main__':
	# 建立程式 p1 p2
    p1 = Process(target=download1, args=("圖片",))
    p2 = Process(target=download2, args=("音樂",))
    # 開啟程式
    p1.start()
    p2.start()
    
    """
    音樂下載進度:20%
    圖片下載進度:20%
    圖片下載進度:40%
    音樂下載進度:40%
    圖片下載進度:60%音樂下載進度:60%
    圖片下載進度:80%
    音樂下載進度:80%
    圖片下載進度:100%音樂下載進度:100%
    """

程式理解

主程式從main()開始執行 → p1.start()時,建立一個子程式
pi子程式中的程式碼與主程式相同,只是程式執行的開始是download1函式 → 主程式執行到
p2.start()時,同樣賦值一份主程式程式碼從download2函式開始執行。

用程式方式來實現多工耗費資源較大,因為一個程式就需要使用一份系統資源

多執行緒

(併發:一個人處理兩個任務,處理過程中,可能會出現兩個任務交替的情況)

多執行緒模組:threading,IO密集型可以使用多執行緒
多執行緒的處理
Thread建立執行緒

Thread([group [, target [, name [, args [, kwargs]]]]])

常用方法:

join():當前執行緒執行完後其他執行緒才會繼續執行(可以阻塞其他的,讓我自己先來)
setDaemon():當前執行緒設定成守護執行緒,主執行緒結束,子執行緒無論是否執行完畢,直接結束
threading模組提供的方法
	threading.currentThread():返回當前的執行緒變數
	threading.enumerate():返回一個包含正在執行的執行緒list,正在執行是指執行緒啟動後、結束前,不包括啟動前和終止後的執行緒
	threading.activeCount():與len(threading.enumerate) 相同;返回正在執行的執行緒數量
import time
from threading import Thread

def download1(name):
    for i in range(1, 6):
        print(f'{name}下載進度:{i * 20}%')
        time.sleep(1)


def download2(name):
    for i in range(1, 6):
        print(f'{name}下載進度:{i * 20}%')
        time.sleep(1)
        
if __name__ == '__main__':
    # 1.建立執行緒
    t1 = Thread(target=download1, args=('音樂',))
    t2 = Thread(target=download2, args=('圖片',))
    # 2.開啟執行緒
    t1.start()
    t2.start()

待完…

相關文章