python的多線程(簡單實現;共享全局變量;自定義線程名;互斥鎖和死鎖)

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) #死鎖就是加一個溢出時間,超過時間就退出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章