python -- 多線程基礎

聲明 – python的多進程並不是真正的並行(GIL)

python裏因爲有GIL的存在
所以python在同一時刻只允許一個線程進行運算
但python的多線程還是會節省下來IO的時間(IO時將執行權限交給下一個線程)

添加線程

引入所需要的庫

import threading

獲取已激活線程數

print(threading.active_count())#打印已激活線程數

查看所有線程信息

print(threading.enumerate())#打印所有線程信息

查看現在正在運行的線程

print(threading.current_thread())#打印現在正在運行的線程

添加線程

def thread_job():#定義線程的函數
    print('This is a thread of %s' % threading.current_thread())

def main():
    thread = threading.Thread(target=thread_job,)#定義線程
    thread.start()  # 讓線程開始工作
    
if __name__ == '__main__':
    main()

添加帶參數的線程

t = threading.Thread(target=job,args=(data[i],q))#target後面的函數名不加括號,args後面的是參數

join(等待某線程結束在繼續運行)

def T1_job():#線程一
    print("T1 start\n")
    for i in range(10):
    	print(i)
    print("T1 finish\n")

def T2_job():#線程二
    print("T2 start\n")
    print("T2 finish\n")

thread_1 = threading.Thread(target=T1_job, name='T1')#定義線程1
thread_2 = threading.Thread(target=T2_job, name='T2')#定義線程2
thread_1.start() # 開啓T1
thread_1.join() #####重點,等待線程1結束在開始運行線程2
thread_2.start() # 開啓T2

Queue 存儲進程結果

引入庫

from queue import Queue

存儲

import threading
from queue import Queue

def job(l,q):## 線程執行的函數
    for i in range (len(l)):
        l[i] = l[i]**2
    q.put(l) 

def multithreading():
    q =Queue()##定義隊列
    threads = []
    data = [[1,2,3],[3,4,5],[4,4,4],[5,5,5]]
    for i in range(4):##開啓四個線程
        t = threading.Thread(target=job,args=(data[i],q))##此處也要把定義的q傳進去
        t.start()
        threads.append(t)
    for thread in threads:## 等待四個線程全部結束
        thread.join()
    results = []
    for _ in range(4):
        results.append(q.get())#從隊列中拿出數據
    print(results)

線程鎖

import threading

def job1():
    global A,lock #定義使用全局變量
    lock.acquire()#鎖線程
    for i in range(10):
        A+=1
        print('job1',A)
    lock.release()#釋放線程鎖

def job2():
    global A,lock #定義使用全局變量
    lock.acquire()#鎖線程
    for i in range(10):
        A+=10
        print('job2',A)
    lock.release()#釋放線程鎖
lock=threading.Lock()#定義進程鎖(全局變量)
A=0
t1=threading.Thread(target=job1)
t2=threading.Thread(target=job2)
t1.start()
t2.start()
t1.join()
t2.join()

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