實例:
import threading
import time
num = 0
def run():
global num #聲明num未全局變量才可在函數里作為全局變量使用,否則函數里的num為局部變量
time.sleep(0.8)
num += 1
def creat_threading():
t_objects = []
for i in range(100):
t = threading.Thread(target=run)#target=方法名,不能加括號,若方法有參數,則需加上args = (n,),如(target=run,args=(n,)),n后面必須加逗號
# t.setDaemon(True)#將線程變為守護線程,即程序無需等待改線程執行完畢
t.start()
t_objects.append(t) #為了不阻塞后面線程的啟動,不在這里join,否則會變成但線程,所以先放到一個列表里再join
# print(i)
for t in t_objects: #循環線程實例表,等待所有線程執行完畢
t.join()#等待線程執行結束
return num
a = creat_threading()
print(a)
python的多線程實際是個假的多線程,不管你有多少核,都只會用一個核。python利用CPU上下文切換的優勢,是我們看起來像使用了并發的效果,實際上它就是一個單線程。IO操作如讀取數據不占用cpu,計算占用cpu。python多線程不適合cpu密集操作型的任務,適合IO操作密集型的任務
線程共用同一資源內存,如線程A修改了name值,在A還未存儲修改后的值線程B又去修改name的值,那么B取到的是name的初始值,A修改后的值會被B修改后的值覆蓋,造成數據不是我們想要的。為解決這種情況,我們需要加鎖,即A在修改的時候不允許B修改
隊列的主要作用:
1、解耦,使程序直接實現松耦合,一個模塊被修改了不會影響其他的
2、提高處理效率
隊列的幾種模式:
1、先進先出
2、后進先出
3、設置優先級