目錄執行緒物件的其他方法
守護執行緒
執行緒資料共享
執行緒互斥鎖
練習:tcp服務端實現併發
什麼是執行緒?
程序其實是乙個資源單位,真正被cpu執行的其實時程序裡面的執行緒
# 程序只是提供給執行緒需要的各項資源
程序類似於工程 執行緒類似於工廠裡面的一條條流水線
所有的程序裡最少有乙個執行緒
程序之間的資料預設是隔離的,但是同乙個程序內的多個執行緒的資料是共享的。
對比開設程序來看一下開設執行緒的方式
開設程序:
1、重新申請一塊記憶體空間
2、將所需的資源全部匯入
開設執行緒:
程序的兩部操作都不需要進行,所以開設執行緒的消耗的資源遠比開設的程序所占用的資源少!!
from threading import thread # 匯入開設執行緒模組
import time
def test(name):
print(f' running')
time.sleep(3)
print(f' over')
t = thread(target=test, args=('gary',))
t.start()
print('主程序')
# 使用類的方法實現開設執行緒 同樣的效果
class myclass(thread):
def __init__(self,name)
super().__init__()
self.name = name
def run(self):
print('%s is running' % self.name)
time.sleep(3)
print('%s is over' % self.name)
obj = myclass('jason')
obj.start()
print('主線程')
可以看到執行緒的執行速度是非常快的
1、join方法
2、獲取程序號(可驗證同乙個程序內可以開設多少個執行緒,同乙個程序中的父執行緒號是相同的)
格式:檢視執行緒號:getpid()
檢視父執行緒號:getppid()
主線程的結束意味著正好程序的結束,所以主線程需要等待裡面所有的非首付執行緒結束才能結束
在同乙個程序內對於執行緒來說所有的資料都是共享的
from threading import thread
money = 100
def test():
global money # 區域性修改全域性 100 變成 999
money = 999
t = thread(target=test)
t.start()
t.join()
print(money)
# 輸出為 999 # 這就說明在同乙個程序內所有執行緒的資料是共享的
from multiprocessing import process
money = 100
def test():
global money # 區域性修改全域性 100 變成 999
money = 999
t = process(target=test)
t.start()
t.join()
print(money)
# 輸出結果為100 # 這裡就說明再開設子程序時是重新申請了乙個記憶體空間與主程序的資料是不共享的
#不加鎖:併發執行,速度快,資料不安全
from threading import thread, lock
from multiprocessing import lock
import time
num = 100
def test(mutex):
global num
mutex.acquire() # 以下內容加鎖
# 先獲取num的數值
tmp = num
# 模擬延遲效果
time.sleep(0.1)
# 修改數值
tmp -= 1
num = tmp
mutex.release() # 釋放鎖
t_list =
mutex = lock()
for i in range(100):
t = thread(target=test, args=(mutex,))
t.start()
# 確保所有的子執行緒全部結束
for t in t_list:
t.join()
print(num)
# 輸出結果為0
這裡可能有疑問:既然加鎖會讓執行變成序列,那麼我在start之後立即使用join,就不用加鎖了啊,也是序列的效果啊
沒錯:在start之後立刻使用jion,肯定會將100個任務的執行變成序列,毫無疑問,最終n的結果也肯定是0,是安全的,但問題是
start後立即join:任務內的所有**都是序列執行的,而加鎖,只是加鎖的部分即修改共享資料的部分是序列的
單從保證資料安全方面,二者都可以實現,但很明顯是加鎖的效率更高.
# 服務端:
import socket
from threading import thread
from multiprocessing import process
server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5) # 限制半連線池數為5
def talk(sock): # 將與使用者端互動的**塊封裝
while true:
try:
data = sock.recv(1024)
if len(data) == 0: break
print(data.decode('utf8'))
sock.send(data + b'go out!')
except connectionreseterror as e:
print(e)
break
sock.close()
while true:
sock, addr = server.accept() # 與客戶端建立連線 來乙個客戶端就開設乙個執行緒
print(addr)
# 開設多程序或者多執行緒 這裡開設多執行緒
python執行緒鎖 守護執行緒,程序鎖 守護程序
1 守護程序 1.1 什麼是守護程序?1 守護程序會在主程序 執行結束的情況下,立即結束。2 守護程序本身其實就是乙個子程序。3 主程序在其 結束後已經執行完畢 守護程序在此時就被 然後主程序會一直等非守護的子程序都執行完畢後 子程序的資源才會結束。1.2 為什麼要用守護程序?1 守護程序本身就是乙...
執行緒 互斥鎖
include include include include include 1.靜態初始化,當動態初始化時,遮蔽靜態初始化 pthread mutex t mutex pthread mutex initializer 2.動態初始化 pthread mutex t mutex int lock...
執行緒互斥鎖
執行緒互斥鎖 降低效率,保證資料安全 執行緒 資料共享 修改共享資料,資料不安全 from threading import thread,lock import time n 100 deftask global n temp n time.sleep 0.1 n temp 1 if name m...