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()