網路程式設計 03:程序與執行緒

一。CPU 時間片

時間片是指 CPU 分配給各個程式的時間,每個執行緒被分配一個時間段,稱為時間片。且存在優先排程演算法,優先順序越高越先執行。單核 CPU 只能實現併發,要想真正實現並行,需要多核 CPU。

二。程序

表示正在執行的程式,執行一個程式,就會產生程序,計算機會把它們載入到記憶體中,作業系統分配時間片,優先順序等,等待 cpu 排程。特點:一個程序產生一塊獨立空間,且程序之間相互獨立,互不影響。

三。時間戳

表示格林威治時間1970年01月01日00時00分00秒(北京1970年01月01日08時00分00秒)到現在的時間的總秒數。使用時間戳:先匯入時間模組——import time,再獲得當前時間戳:time。time(),(就相當於當前時間減去格林威治時間)。

四。單程序

使用睡眠來模擬耗時操作,檢視整個程式的執行時間

1.導包

import time

2.再將時間戳封裝成一個函式

def new_time(): “”“ 返回asc格式的當前時間 :return: ”“” return time。asctime(time。localtime(time。time()))

3.再定義一個子程序

def func(): print(‘func-start’, new_time()) time。sleep(5) print(‘func-end’, new_time())

4.最後同時執行主程序和子程序

print(‘main-start’,new_time())func()time。sleep(5)print(‘main-end’,new_time())

import timedef new_time(): “”“ 返回asc格式的當前時間 :return: ”“” return time。asctime(time。localtime(time。time()))def func(): print(‘func-start’, new_time()) time。sleep(5) print(‘func-end’, new_time())print(‘main-start’,new_time())func()time。sleep(5)print(‘main-end’,new_time())

五。多程序

使用多程序來分擔耗時任務,在另一個程序中執行耗時任務。這樣主程序就不會受到影響,並且可以提升效率。作業系統進行排程時,程序數多於核心數沒有效果,一般來說cpu是幾個核心的我們就開幾個程序,分擔耗時任務。

當子程序執行完時,返回子程序的執行結果

1.導包(匯入時間模組和多程序模組)

import timeimport multiprocessing

2.定義一個函式封裝時間戳

def new_time(): “”“ 返回asc格式的當前時間 :return: ”“” return time。asctime(time。localtime(time。time()))

3.再定義一個函式封裝子程序

def func(): print(‘func-start’, new_time()) time。sleep(5) print(‘func-end’, new_time())

4.例項化子程序,將程序設定為多程序

print(‘main-start’,new_time())p1 = multiprocessing。Process(target = func) # 例項化一個新的子程序p1。start()time。sleep(5)print(‘main-end’,new_time())

target 表示該程序需要執行的任務

args 表示傳入引數,將值傳給函式,需要的型別是元組型別

import timeimport multiprocessingdef new_time(): “”“ 返回asc格式的當前時間 :return: ”“” return time。asctime(time。localtime(time。time()))def func(): print(‘func-start’, new_time()) time。sleep(5) print(‘func-end’, new_time())print(‘main-start’,new_time())p1 = multiprocessing。Process(target = func) # 例項化一個新的子程序p1。start() #讓程序開始執行它的任務time。sleep(5)print(‘main-end’,new_time())

六。執行緒

如果把程序比做一個工廠,那麼執行緒就是工廠裡面的工人,也就是一個程序可以包含多個執行緒

車間的空間是工人們共享的,比如許多房間是每個工人都可以進出的。這象徵一個程序的記憶體空間是共享的,每個執行緒都可以使用這些共享記憶體。

一個執行緒可以被搶佔(中斷) 也可以臨時掛起(睡眠)等

執行緒的排程由Python直譯器排程,而程序由作業系統排程

1.多執行緒

與多程序相仿,在單程序的基礎上匯入多執行緒模組,例項化新的子程序後執行。

多執行緒不適合解決計算密集型的情形,但是適合IO密集型的場景。因為在同一個程序內,並不會額外分配其他的系統資源。

Python中的多執行緒在遇到阻塞的時候,會自動切換到非阻塞的執行緒上去

import timeimport threadingdef new_time(): “”“ 返回asc格式的當前時間 :return: ”“” return time。asctime(time。localtime(time。time()))def func(x,y): print(‘func-start’, new_time()) print(x+y) time。sleep(5) print(‘func-end’, new_time())print(‘main-start’,new_time())t1 = threading。Thread(target=func,args=(1,2)) #例項化新的子程序t1。start() # 執行time。sleep(5)print(‘main-end’,new_time())

2.多程序實現併發

import socketimport multiprocessing“”“主程序做連線客戶端,生成對等連線套接字,通道連線建立一個子程序,接收客戶端傳送的資料”“”def f_recv(conn): “”“ 接受客戶端傳送的資料,並返回資料 :param conn: 對等連線套接字 :return:None ”“” while True: data = conn。recv(1024) if data: print(data) conn。send(data) else: conn。close() breakdef f_accpet(): “”“ 建立服務端套接字 連線客戶端,生成對等連線套接字 :return: None ”“” server = socket。socket() server。bind((‘127。0。0。1’,9090)) server。listen(10) while True: conn,addr = server。accept() p1 = multiprocessing。Process(target=f_recv,args=(conn,)) p1。start()if __name__ == ‘__main__’: f_accpet()

3.多執行緒實現併發(建議使用多執行緒,多執行緒在遇到阻塞時會切換到另一個執行緒繼續執行)

import socketimport threading“”“主程序做連線客戶端,生成對等連線套接字,通道連線建立一個子程序,接收客戶端傳送的資料”“”def f_recv(conn): “”“ 接受客戶端傳送的資料,並返回資料 :param conn: 對等連線套接字 :return:None ”“” while True: data = conn。recv(1024) if data: print(data) conn。send(data) else: conn。close() breakdef f_accpet(): “”“ 建立服務端套接字 連線客戶端,生成對等連線套接字 :return: None ”“” server = socket。socket() server。bind((‘127。0。0。1’,9090)) server。listen(10) while True: conn,addr = server。accept() t1 = threading。Thread(target=f_recv,args=(conn,)) t1。start()if __name__ == ‘__main__’: f_accpet()

附(今日份學習):

單程序:

網路程式設計 03:程序與執行緒

多程序:

網路程式設計 03:程序與執行緒

多執行緒:

網路程式設計 03:程序與執行緒

多程序實現併發:

網路程式設計 03:程序與執行緒

網路程式設計 03:程序與執行緒

多執行緒實現併發:

網路程式設計 03:程序與執行緒

網路程式設計 03:程序與執行緒