程序與執行緒

2021-08-29 12:31:18 字數 3929 閱讀 8693

程序是載入到記憶體,正在被執行的程式。每個程序都擁有自己的位址空間、記憶體、資料棧以及其他用於跟蹤執行的輔助資料。程序是表示資源分配的的基本概念,又是排程執行的基本單位,是系統中的併發執行的單位。執行緒是比程序還小的執行基本單元,乙個程序至少有乙個執行緒。執行緒是一種輕量級的程序,多執行緒處理就是允許乙個程序中在同一時刻執行多個任務。

並行是指同一時刻同時做多件事情,而併發是指同一時間間隔內做多件事情。並行的必要條件就是cpu核心數 >= 總程序數 ,併發是多個程序在乙個cpu上交替進行,但看上去好像是一起執行。

python模組——multiprocessing

大致流程:

例項化乙個程序,引數分別是函式名、可選引數*args、可選引數**kwargs。

開啟程序

下面是乙個小例子

import multiprocessing

import time

print("start--{}".format(time.asctime(time.localtime(time.time()))))

def run():

print("start1--{}".format(time.asctime(time.localtime(time.time()))))

time.sleep(5)#模擬阻塞任務

print("end1--{}".format(time.asctime(time.localtime(time.time()))))

pro = multiprocessing.process(target=run)

pro.start()

time.sleep(5)#模擬阻塞任務

print("end--{}".format(time.asctime(time.localtime(time.time()))))

start--sat oct 20 23:49:04 2018

start1--sat oct 20 23:49:04 2018

end--sat oct 20 23:49:09 2018

end1--sat oct 20 23:49:09 2018

上述執行結果表明執行時間為5秒,上述**有兩個阻塞任務,每個阻塞任務都會耗時5秒,正常情況下,執行時間應該為10秒,但這裡為兩個阻塞多開了乙個程序,即在同一時間同時處理這兩個阻塞,所以耗時為5秒。下面是未開程序的**及執行結果。

import time

print("start--{}".format(time.asctime(time.localtime(time.time()))))

def run():

print("start1--{}".format(time.asctime(time.localtime(time.time()))))

time.sleep(5)#模擬阻塞任務

print("end1--{}".format(time.asctime(time.localtime(time.time()))))

run()

time.sleep(5)#模擬阻塞任務

print("end--{}".format(time.asctime(time.localtime(time.time()))))

start--sat oct 20 23:53:44 2018

start1--sat oct 20 23:53:44 2018

end1--sat oct 20 23:53:49 2018

end--sat oct 20 23:53:54 2018

上述執行時間為10秒

python在設計的時候還沒有多核處理器的概念,因此為了設計方便與執行緒安全,直接設計了乙個鎖,這個鎖要求在任何程序中,一次只能有乙個執行緒執行,因此python並不能為多個執行緒分配多個cpu,所以python中的執行緒只能實現併發,不能實現真正的並行。但在python3中的gil鎖有乙個很棒的的設計,那就是在遇到阻塞時會自動切換執行緒。

python模組——threading

大致流程:

例項化乙個執行緒,引數分別是函式名、可選引數*args、可選引數**kwargs。

開啟執行緒

import threading

import time

print("start--{}".format(time.asctime(time.localtime(time.time()))))

def run():

print("start1--{}".format(time.asctime(time.localtime(time.time()))))

time.sleep(5)#模擬阻塞任務

print("end1--{}".format(time.asctime(time.localtime(time.time()))))

pro = threading.thread(target=run)

pro.start()

time.sleep(5)#模擬阻塞任務

print("end--{}".format(time.asctime(time.localtime(time.time()))))

start--sun oct 21 00:08:22 2018

start1--sun oct 21 00:08:22 2018

end--sun oct 21 00:08:27 2018

end1--sun oct 21 00:08:27 2018

執行時間為5秒,說明開闢的執行緒避開了阻塞任務。

由於執行緒能有效的避開阻塞任務,故可以利用這一點實現服務端的多執行緒併發。

import socket

import threading

server = socket.socket()

server.bind(('127.0.0.5',8520))

server.listen(50)

def func(a):

date = a.recv(1024)

if date:

print("已收到資訊-->{}".format(date.decode()))

a.send(date)

else:

a.close()

while true:

a, b = server.accept()

pro = threading.thread(target=func,args = (a,))

pro.start()

import socket

import multiprocessing

server = socket.socket()

server.bind(('127.0.0.5',8520))

server.listen(50)

def func(a):

date = a.recv(1024)

if date:

print("已收到資訊-->{}".format(date.decode()))

a.send(date)

else:

a.close()

while true:

a, b = server.accept()

pro = multiprocessing.process(target=func,args = (a,))

pro.start()

程序與執行緒

程序 process 管理單元,管理分配應用程式的資料,的記憶體空間.執行緒 thread 執行單元,執行緒負責執行乙個預先編排好的 段,執行 棧是基於執行緒的.乙個應用程式啟動的時候,程序自動建立,並且會預設建立主線程,主線程負責執行main 方法.thread t new thread new ...

程序與執行緒

程序 是擁有資源的實體,包括 1。乙個程序有乙個虛擬位址空間,不同程序位於不同的 虛擬位址空間中。程序之間若要通訊,必須通過作業系統 的功能呼叫 ipc 2。程序擁有其他資源,例如開啟的檔案和i o裝置。程序結束時,作業系統會自動釋放該程序擁有的所有資源。例如,如果 open乙個檔案而不close它...

程序與執行緒

程序包括 1 私有的虛位址空間 2 可執行程式 與資料 3 開啟系統資源列表控制代碼 4 安全訪問標誌 5 程序id 6 至少有乙個執行執行緒 執行緒包括 1 一組cpu暫存器狀態 2 兩個堆疊 系統態與使用者態 3 tls 執行緒區域性儲存區 4 執行緒id 5 安全特性 因此程序是不活潑的,它從...