1多線程概念:多線程指的是從軟件或者硬件上實現多個線程併發執行的技術,通俗上說就是同時執行的多個任務。(同時執行多個任務就是並行,這是個僞概念,因爲pycharm的運行機制決定了不可能真正實現並行)
2簡單實現一個多線程:
#併發 :先寫一個字喫兩口蘋果在寫幾個字再喫幾口蘋果
#並行 :一邊喫蘋果一邊寫作業
#進程 :
#線程 :
#協程 :
import threading
import time
def Sing():
for i in range(5):
print('正在唱歌')
time.sleep(1)
def Dance():
for j in range(5):
print('正在跳舞')
time.sleep(1)
if __name__ == '__main__':
print('調用前:',threading.enumerate()) #threading.enumerate() :查看線程
t = threading.Thread(target=Sing)
t2 = threading.Thread(target=Dance)
print('創建線程後:',threading.enumerate())
t.start()
t2.start()
print('調用後:',threading.enumerate())
3共享全局變量多線程,在同一進程下的多個線程裏全局變量是共享的:
import threading
#全局變量
num = 0
# 任務一:加1
def work1(number):
global num
for i in range(number):
num += 1
print('此時num等於',num)
# 任務二:加1
def work2(number):
global num
for i in range(number):
num += 1
print('此時num等於',num)
if __name__ == '__main__':
t1=threading.Thread(target=work1,args=(1000000,))
t2=threading.Thread(target=work2,args=(1000000,))
t1.start()
t2.start()
4自定義線程名:
import threading
class MyThread(threading.Thread):
def __init__(self,num):
super(MyThread, self).__init__() #引用父類初始化
self.num = num
def run(self):
print('我是線程:%s'%self.num)
if __name__ == '__main__':
mythread = MyThread(666)
mythread.start()
5互斥鎖和死鎖:互斥鎖是指鎖住一個線程或進程執行,執行完後再執行下一個。
死鎖是指兩個或兩個以上的進程或線程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。
import threading
#全局變量
num = 0
# 任務一:加1
def work1(number):
#上鎖
lock.acquire()
global num
for i in range(number):
num += 1
print('此時num等於',num)
#解鎖
lock.release()
# 任務二:加1
def work2(number):
lock.acquire()
global num
for i in range(number):
num += 1
print('此時num等於',num)
lock.release()
#創建互斥鎖
lock=threading.Lock()
if __name__ == '__main__':
t1=threading.Thread(target=work1,args=(10000000,))
t2=threading.Thread(target=work2,args=(10000000,))
t1.start()
t2.start()
lock.acquire(timeout=1) #死鎖就是加一個溢出時間,超過時間就退出