python day39 正式學習

2022-07-01 17:39:13 字數 2766 閱讀 4697

目錄訊號量

gil全域性直譯器鎖

from threading import thread,lock

x=0lock=lock()

def test():

lock.acquire() #鎖住不讓cpu切換

global x

for i in range(111100):

x+=1

lock.release()

t=thread(target=test)

t1=thread(target=test)

t2=thread(target=test)

t.start()

t1.start()

t2.start()

t.join()

t1.join()

t2.join()

print(x)

被其他執行緒占用了鎖頭導致執行緒阻塞

from threading import thread,lock

import time

l1=lock()

l2=lock()

def test1():

l1.acquire()

print('one1suo')

time.sleep(1)

l2.acquire()

print('one2suo')

l1.release()

print('one1fang')

l2.release()

print('one2fang')

def test2():

l2.acquire()

print('two2suo')

l1.acquire()

print('two1suo')

l2.release()

print('two2fang')

l1.release()

print('two1fang')

t=thread(target=test1)

t1=thread(target=test2)

t.start()

t1.start()

同乙個鎖可多次使用acquier()和release()

from threading import thread,rlock,lock

import time

l1=rlock()

l2=l1

def test1():

l1.acquire()

print('one1suo')

time.sleep(1)

l2.acquire()

print('one2suo')

l1.release()

print('one1fang')

l2.release()

print('one2fang')

def test2():

l2.acquire()

print('two2suo')

l1.acquire()

print('two1suo')

l2.release()

print('two2fang')

l1.release()

print('two1fang')

t=thread(target=test1)

t1=thread(target=test2)

t.start()

t1.start()

from threading import thread,rlock,lock,semaphore

import time

def test1():

s.acquire()

print('nice')

time.sleep(1)

s.release()

s=semaphore(5)

for i in range(15):

t = thread(target=test1)

t.start()

# 在cpython直譯器中有一把gil鎖(全域性直譯器鎖),gil鎖本質是一把互斥鎖。

# 導致了同乙個程序下,同一時間只能執行乙個執行緒,無法利用多核優勢.

# 同乙個程序下多個執行緒只能實現併發不能實現並行.

# 為什麼要有gil?

# 因為cpython自帶的垃圾**機制不是執行緒安全的,所以要有gil鎖.

# 導致了同乙個程序下,同一時間只能執行乙個執行緒,無法利用多核優勢.

##分析:

# 我們有四個任務需要處理,處理方式肯定是要玩出併發的效果,解決方案可以是:

# 方案一:開啟四個程序

# 方案二:乙個程序下,開啟四個執行緒

# 計算密集型 推薦使用多程序

# 每個都要計算10s

# 多執行緒

# 在同一時刻只有乙個執行緒會被執行,也就意味著每個10s都不能省,分開每個都要計算10s,共40.ns

# 多程序

# 可以並行的執行多個執行緒,10s+開啟程序的時間

# io密集型 推薦多執行緒

# 4個任務每個任務90%大部分時間都在io.

# 每個任務io10s 0.5s

# 多執行緒

# 可以實現併發,每個執行緒io的時間不咋占用cpu, 10s + 4個任務的計算時間

# # 多程序

# 可以實現並行,10s+1個任務執行的時間+開程序的時間

python day40 正式學習

目錄執行緒定時器 程序池和執行緒池 import queue q queue.queue q.put 123 q.put 456 q.put 789 print q.get print q.get print q.get q.task done q.task done q.task done q.j...

python day38 正式學習

目錄子執行緒和子程序的建立速度 子執行緒共享資源 執行緒的join方法 守護執行緒 執行緒其他用法 from threading import thread import time def test print hello world t thread target test t.start pri...

python day17 正式學習

目錄注意事項 模組不來總結了,直接去看吧 包是模組的一種形式,包的本質就是乙個含有.py的檔案的資料夾。模組的第乙個版本只有10個功能,但是未來在擴充套件版本的時候,模組名和用法應該最好不要去修改,但是這只是對使用者友好,而由於版本擴充套件,檔案越來越大,模組設計者對模組的管理 維護會越來越複雜,因...