靜程 線程
一個靜程有多個線程
Window任務管理器
進程獨立的所有的子任務的集合
進程 進程的目的都是相同的完成任務
特點獨立(CPU使用獨立,內存獨立)、啓動進程開銷大(速率低) 進程之間很難共享數據,和數據通信
進程的特點 獨立內存獨立 CPU使用獨立啓動進程開銷大速率低進程之間很難共享數據和數據通信數據安全。
線程的特點依賴進程,CPU獨立,線程之間共享數據方便通信,線程不安全。
多線程裏面有多個單線程。
Def a ():
枷鎖
B()
釋放索
Def b():
枷鎖
A()
釋放索
CPU只能一個一個執行線程,CPU執行速度非常快,處理快。。排隊執行線程。
Python3實現線程函數和類
-thread
方法:
threading.currentThread(): 返回當前的線程變量。
threading.enumerate(): 返回一個包含正在運行的線程的list。正在運行指線程啓動後、結束前,不包括啓動前和終止後的線程。
threading.activeCount(): 返回正在運行的線程數量,與len(threading.enumerate())有相同的結果。
Run():用以表示線程活動的方法
Start():啓動線程活動
Join([time]):等待至線程中址,這阻塞調用線程
線程從創建、運行到結束總是處於下面五個狀態之一:新建狀態 、就緒狀態 、運行狀態 、阻塞狀態及死亡狀態。
a)新建狀態(New):
當用new操作符創建一個線程時,例如new Thread(r),此時線程處於新建狀態, 程序還沒有開始運行線程中的代碼
b)就緒狀態(Runnable)
一個新創建的線程,自己不會自動開始運行。要執行線程的話,必須去調用start()方法。當線程對象調用start()方法時,就意味着啓動了線程,start()方法創建線程運行的系統資源,並調度線程運行run()方法。當start()方法返回後,線程就處於就緒狀態。
如果是多線程的話,處於就緒狀態的線程,不一定馬上去運行run()方法,它還必須要跟其他的線程競爭CPU,只有在獲得CPU時間後,纔可以運行線程。因爲在單CPU的計算機系統中,多個線程是不可能一起運行的,在某一個時間點,只會有一個線程是正在運行。這個時候處於就緒狀態的就不一定是一個,也有可能是好幾個
c)運行狀態(Running) : 一個線程,它在獲得CPU時間後,才進入運行狀態,真正開始執行run()方法
d)阻塞狀態(Blocked): 線程運行過程中,會因爲各種原因,進入到阻塞狀態:
1。線程通過調用sleep方法進入睡眠狀態;
2。線程想要得到一個鎖,而這個鎖正被其他線程佔着,用不了;
3。線程在等待某個觸發條件;
......
說白了,阻塞狀態說的就是:正在運行的線程還沒有運行結束,只是暫時的讓出CPU,這個時候其他處於就緒狀態的線程,就獲得了CPU的時間,進入運行狀態。
e)死亡狀態(Dead) : 兩個原因會導致線程死亡
(1) run方法正常退出而自然死亡,
(2) 一個未捕獲的異常,終止了run方法,而使線程死亡。
爲了確定線程在當前是否存活着(一個是被阻塞了,二個是正常在運行着),就要用到isAlive方法。 如果是可運行或被阻塞,這個方法返回true;如果線程仍舊是new狀態,且不是可運行的,或者線程死亡了,則返回false。
Lock=threading.Lock()
Cond=threading,condition(lock=lock)
由於併發的問題需要加鎖。
#調用 _thread 模塊中的start_new_thread()函數來產生新線程。
import threading
import time
def test():
for i in range(11):
print(i)
time.sleep(1)
print('-----main------')
threading._start_new_thread(test,())
for i in range(50,39,-1):
print(i)
time.sleep(1)
input()
#------------------------------
#線程類方法
import threading
import time
class Mythread(threading.Thread):
def __init__(self,name = None):
threading.Thread.__init__(self)
self.name = name
print('mythreading......')
def run(self):
for i in range(11):
print("%s \t %d"%(self.name,i))
time.sleep(1)
def start(self):
print("我很好")
super().start()
t = Mythread("ewew")
t2 = Mythread("sdfd")
t.start()
t2.start()
for i in range (20,10,-1):
print(i)
time.sleep(1)
#------------------------------------
import threading
import time
class Mythread(threading.Thread): # 線程一 寫一個類繼承threading.Thread
def run(self):
for i in range(11):
if i == 3:
cond.acquire()
cond.wait()
cond.release()
print(i)
time.sleep(1)
t = Mythread()
t.start()
lock = threading.Lock()
cond = threading.Condition(lock=lock)
class Mythread2(threading.Thread):
def run(self):
for i in range(50, 39, -1):
print(i)
time.sleep(1)
cond.acquire()
cond.notify()
cond.release()
t1 = Mythread2()
t1.start()