多線程簡介

進程 process : 一個程序的執行實例 擁有字節獨立資源,數據和主進程
線程 thread : 同一進程可被並行激活的控制流,共享相同空間地址,數據結構
(注:存在Python GIL 全局解釋器鎖 全局而言,本質上一個線程執行)

爲了節約資源的使用, 在一個進程中往往存在多個線程,那如何實現多線程操作?

1.使用import Threading.thread()建立線程

import time
impoer threading

def worker(n):
    print(f"函數開始執行於:{time.ctime()}")
    print('當前線程的名字是: ', threading.current_thread().name)  #獲取當前線程名稱
    time.sleep(n)
    print (f"函數結束於:{time.ctime()},前線程的名字是: '{threading.current_thread().name}")


def main():
    print(f"主函數開始{time.ctime()}")

    threads=[]                                        #使之同時啓動
    
    t1=threading.Thread(target=worker,args=(4,))      #traget參數,執行函數。args傳遞參數
    threads.append(t1)

    t2 = threading.Thread(target=worker, args=(2,))
    threads.append(t2)

    for t in threads:
        t.start()

    for t in threads:
        t.join()

    print(f"主函數結束於{time.ctime()}")

if __name__ == '__main__':
    main()

2 通過派生類實用線程

import threading
import time

def worker(n):
    print(f"函數開始執行於:{time.ctime()}")
    print('當前線程的名字是: ', threading.current_thread().name)
    time.sleep(n)
    print (f"函數結束於:{time.ctime()},前線程的名字是: '{threading.current_thread().name}")


class MyThread(threading.Thread):
    def __init__(self,func,args):
        threading.Thread.__init__(self)
        self.func = func
        self.args = args

    def run(self):                                    #定義線程啓動函數,和下文對應star相呼應
        self.func(*self.args)
def main():
    print(f"主函數開始{time.ctime()}")

    threads=[]                                        #使之同時啓動
   
    t1=MyThread(worker,args=(4,))
    threads.append(t1)
    t2 = MyThread(worker, args=(2,))
    threads.append(t2)

    for t in threads:
        t.start()

    for t in threads:
        t.join()

    print(f"主函數結束於{time.ctime()}")

if __name__ == '__main__':
    main()

3 同步鎖 threading.Lock()
將多線程鎖住,使得信息流通不出現問題

eggs=[]
lock = threading.Lock()         #鎖

def put_egg(n,lst):
    lock.acquire()             #鎖上
    for i in range(1,n+1):
        time.sleep(random.randint(0,2))
        lst.append(i)
    lock.release()
def main():
    threads=[]

    for i in range(3):
        t=threading.Thread(target=put_egg,args=(5,eggs))
        threads.append(t)
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    print(eggs)


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