在傳統作業系統中,每乙個程序就有乙個位址空間,而且預設就有乙個控制線程,cpu真正的執行單位是執行緒。
就好比在工廠中,每個車間都有房子,這個房子就是記憶體空間,每個車間預設有一條流水線,就是執行緒。
作業系統==》工廠
程序==》車間
執行緒==》流水線
cpu==》電源
執行緒:cpu最小的執行單位
程序:資源集合/資源單位
執行緒執行=執行**
程序執行=各種資源 +執行緒
執行:申請記憶體空間,先把直譯器丟進去並把**丟進去,執行**。
程序和執行緒的區別:
執行緒==》單指**的執行過程
程序==》資源的申請與銷毀的過程
程序記憶體空間彼此隔離,同乙個程序下的執行緒共享資源。
程序和執行緒的建立速度比較:
程序建立速度遠小於執行緒建立速度
因為程序需要申請資源開闢空間,很慢,執行緒只是告訴作業系統乙個執行方案,很快,不用開闢新空間。
一、
from threading import thread
import time
def task():
print('執行緒 start')
time.sleep(2)
print('執行緒 end')
if __name__ == '__main__':
t = thread(target=task)
t.start() # 告訴作業系統開乙個執行緒 .
print('主')
二、
from threading import thread
import time
# 程序等待所有執行緒結束才會結束
class myt(thread):
def run(self):
print('子執行緒 start')
time.sleep(5)
print('子執行緒 end')
t = myt()
t.start()
print('主線程')
會發現和程序很相似,幾乎一樣了。
那麼也會有join方法了
from threading import thread
import time
def task():
print('子執行緒 start')
time.sleep(2)
print('子執行緒 end')
t = thread(target=task)
t.start()
t.join() # 等待子執行緒執行結束
print('主線程')
和程序的是一樣的,等待某個子執行緒結束後,在join的阻塞才會結束。
from threading import thread
import time,os
x = 100
def task():
global x
x = 50
print(os.getpid()) # 5204
if __name__ == '__main__':
t = thread(target=task)
t.start()
time.sleep(2)
print(x) # 50
print(os.getpid()) # 5204
多個子執行緒共享同一塊記憶體空間,也就是同一塊程序的空間。乙個子執行緒對空間中的物件進行了改變操作,別的子執行緒訪問到的也是已經被改變過的東西了。
from multiprocessing import process
from threading import thread
import time
def task():
print('程序 開啟')
time.sleep(10)
print('程序 結束')
def task2():
print('子執行緒 開啟')
# time.sleep(2)
print('子執行緒 結束')
if __name__ == '__main__':
p = process(target=task)
t = thread(target=task2)
t.start() # 開執行緒
p.start() # 開程序
print('子程序join開始')
p.join() # 主程序的主線程等待子程序執行結束
print('主')
主程序裡的p.join()只會阻塞住主線程,而不會阻塞住子執行緒。
from threading import thread,currentthread,enumerate,activecount
# import threading
import time
# threading.current_thread()
# threading.current_thread()
def task():
print('子執行緒 start')
time.sleep(2)
print('子執行緒 end')
print(enumerate())
# print(currentthread(),'子執行緒')
if __name__ == '__main__':
t1 = thread(target=task)
t2 = thread(target=task)
t1.start()
t2.start()
# print(t1.is_alive()) # true
# print(t1.getname()) # thread-1
# print(t2.getname()) # thread-2
# t1.setname('班長')
# print(t1.getname())
# print(currentthread().name)
# print(enumerate()) # [<_mainthread(mainthread, started 1856)>, , ]
# print(activecount()) # 3
# print(len(enumerate())) # 3
is_alive():判斷執行緒是活是死
get_name():獲得執行緒的名字
set_name():修改執行緒的名字。
currentthread():返回當前執行緒的名稱
enumerate():返回當前還存活著的執行緒,不包括未開啟和已結束的,以列表的形式
activecount():返回活著的執行緒的數量
那麼這個和守護程序也是很像的東西了
# 守護執行緒 守護的是程序的執行週期
from threading import thread,enumerate,currentthread
import time
def task():
print('守護執行緒開始')
print(currentthread())
time.sleep(20)
# print('守護執行緒結束')
def task2():
print('子執行緒 start')
time.sleep(5)
print(enumerate())
print('子執行緒 end')
if __name__ == '__main__':
t1 = thread(target=task)
t2 = thread(target=task2)
t1.daemon = true
t2.start()
t1.start()
print('主')
一.執行緒與程序執行完畢的區別:
1.主程序執行完畢指的是主程序**執行完畢
2.主線程執行完畢指的是所在的程序內的所有非守護執行緒執行完畢後,主線程才算執行完畢
強調:執行完畢,並非是終止
二.守護程序:主程序**執行完畢,守護程序也就結束(守護的是主程序)
主程序要等非守護程序都執行完畢後再**子程序的資源(否則會產生殭屍程序)才結束
主程序等子程序是因為主程序要給子程序收屍(代用wait方法向作業系統發起**資 源訊號(pid號,狀態資訊))
守護程序:主程序**執行完畢,守護程序也就結束
守護執行緒:非守護執行緒執行完畢,守護執行緒結束
執行緒知識點
1.join 執行緒a 呼叫了 執行緒b 的 join 方法 執行緒a 必須等待執行緒b 執行完後 才能執行 2.yield sleep wait notify 釋放鎖問題 呼叫yield sleep 執行緒 持有的鎖 不釋放 wait 呼叫方法前 必須持有鎖,呼叫之後釋放鎖,wait 返回後持有鎖...
執行緒知識點總結
j a執行緒的兩個特性 可見性和有序性 多個執行緒之間是不能傳遞資料互動的,他們之間的互動只能通過共享變數來實現。在多個執行緒之間共享了count類的乙個物件,這個物件時被建立在主記憶體 堆記憶體 每個執行緒都有自己的工作記憶體 執行緒棧 工作記憶體儲存了主記憶體count物件的乙個副本,當執行緒操...
有關執行緒的知識點
今天總結的是有關執行緒的知識點 執行緒的狀態轉換是執行緒控制的基礎。執行緒狀態總的可分為五大狀態 分別是生 死 可執行 執行 等待 阻塞。用乙個圖來描述如下 睡眠的實現 呼叫靜態方法。try catch interruptedexception e 設定執行緒的優先順序 執行緒預設的優先順序是建立它...