1. 程式人生 > 其它 >7.22學習日記

7.22學習日記

今日內容

執行緒的概念

程序是作業系統排程的最小單位
一個程序至少有一個執行緒
一個程序中可以開多個執行緒
執行緒是cpu排程的最小單位
真正幹活的是執行緒

如何開啟執行緒

from multiprocessing import Process
from threading import Thread

def task():
print('1')

if __name__ == '__main__':
t = Thread(target=task , args=())
t.start()

GIL鎖

python在設計之初就考慮到要在主迴圈中,同時只有一個執行緒在執行
雖然python直譯器可以執行多個執行緒,但是在任意時刻只有一個執行緒在直譯器中執行

GIL鎖是在python直譯器中的,只有在cpython中有,pypy直譯器是沒有的
起一個垃圾回收執行緒,一個是正常執行的執行緒
設定了一把鎖(GIL鎖),一個執行緒想要執行,必須拿到這把鎖
同一時刻,開啟一個程序,一個程序中可以有多個執行緒,只能有一個執行緒在執行
如果是計算密集型:要開程序
如果是io密集型:要開執行緒

程序和執行緒的效率比較

def task():
time.sleep(1)
print('主執行緒')

if __name__ == '__main__':
ctime = time.time()
t = Process(target=task , args=())
t.start()
t.join()
print('主執行緒')
print(time.time() - ctime)

# 程序結果1.1050267219543457

def task():
time.sleep(1)
print('主執行緒')

if __name__ == '__main__':
ctime = time.time()
t = Thread(target=task , args=())
t.start()
t.join()
print('主執行緒')
print(time.time() - ctime)

# 執行緒結果1.0038325786590576

執行緒之間的資料共享問題

執行緒之間的資料是共享的
程序之間的資料是隔離的

threading模組

t.is_alve() # 判斷執行緒是否存活
t.setName() # 執行緒名
threading.currentThread() # 當前執行緒的變數
threading.emumerate() # 以列表的形式顯示正在執行的執行緒
threading.activeCount() # 返回現在執行的執行緒數量
t = Thread(target=task , args=()) # 開啟守護執行緒,主執行緒結束,子程序跟著結束

def task():
time.sleep(1)
print('主執行緒')

if __name__ == '__main__':
t = Thread(target=task , args=())
t.start()
print('主執行緒')

互斥鎖

# 併發程式設計的弊端,資料安全問題
from threading import Thread,Lock
import time
def task(lock):
lock.acquire()
global n
temp = n
# 併發安全問題
# n-=1
time.sleep(1)
n = temp - 1
lock.release()
if __name__ == '__main__':
n = 10
lock=Lock()
ll = []
for i in range(10):
t = Thread(target=task,args=(lock,) )
t.start()
ll.append(t)
for j in ll:
j.join()
print('主執行緒', n)

訊號量

訊號量等同於多把鎖,允許多個執行緒更改資料
from threading import Thread,Lock
import time
def task(i,sm):
sm.acquire() # 上鎖
print('%s開始了'% i)
time.sleep(1)
print('%s結束了'% i)
sm.release() # 解鎖

if __name__ == '__main__':
sm = Semaphore(1) # 例項化
for i in range(10):
t = Thread(target=task , args=(i,sm))
t.start()

Event事件

def girl(event):
print('戀愛中')
time.sleep(3)
print('分手了')
event.set() # 發出訊號


def boy(event, i):
print('%s等待中' % i)
event.wait() # 等待接收訊號
print('%s開始追了' % i)


if __name__ == '__main__':
event = Event() # 例項化
t = Thread(target=girl, args=(event,))
t.start()
ll = []
for i in range(3):
b_t = Thread(target=boy, args=(event, i))
b_t.start()
ll.append(b_t)
for j in ll:
j.join