python全棧開發day34-線程Thread
一、昨日內容回顧
1. 概念和理論
進程是計算機資源分配最小單位
進程三狀態、同步、異步、阻塞、非阻塞
2. 進程的創建
實例化、自建類run,start,join,terminate,daemon等
3.進程的同步控制
Lock:互斥鎖
Semaphore:鎖+計數器
Event:事件
4.進程間的通信
隊列Queue:put、get、empty、full、put_nowait、get_nowait 管道+鎖
進程之間的數據安全--進程安全
可以是任意數據類型
管道Pipe:
有兩端,雙向通信
需要關閉掉不用的所有端口,才會在recv處報錯
進程不安全
5.數據共享 Manager:dict,list
# 進程都在同一臺計算機上使用
# 數據在進程之間不安全
目前常用的進程之間的數據共享:消息中間件
#memcache
#rabbitmq
#redis
6.進程池Pool
#什麽情況下用進程池:
# 高cpu型的代碼需要用進程池
#進程池cpu個數+1
# Pool池
apply同步
apply_async 異步提交
#get 獲取返回值
#close
#join
map
# apply_async的簡化版,它內部實現了close和join方法
#但是沒有get方法,無法接受返回值
回調函數:apply_async(callback=???)
# 回調函數實在主進程中執行的
7,信號量和進程池的區別,信號量的用處
#在同一時刻只會有n個進程在執行某段代碼
#不同:
#信號量是有多少任務開啟多少進程,信號量仍然給操作系統帶來了很多負擔。
# 池中進程的數量是固定的,只是分別借用池中的進程來執行任務而已
信號量的用處(同一target函數中,高IO部分用多進程,高CPU部分用信號量計算,這樣節省進程切換等開銷):
二、線程
1. 線程的概念和特點
為什麽有進程還要開啟線程:
線程是計算機中能被cpu調度的最小單位:
多線程的特點:並發的、輕量級、數據不隔離
多進程的特點:並發的、操作笨重、數據隔離
2.線程的開啟
import json import time,os from threading import Thread def func(): for i in range(10): time.sleep(0.5) print(‘Thread:‘, i,os.getpid()) if __name__ == ‘__main__‘: t = Thread(target=func) t.start() time.sleep(1) print(‘in main 1‘,os.getpid()) time.sleep(1) print(‘in main 2‘,os.getpid())主線程和子線程在同一進程
3.效率測試
from multiprocessing import Process from threading import Thread import time def func(num): print(num**num) if __name__ == ‘__main__‘: p_lst = [] start = time.time() for i in range(50): p = Process(target=func, args=(i,)) p.start() p_lst.append(p) for i in p_lst: i.join() print(‘======‘, time.time()-start) t_lst = [] start = time.time() for i in range(50): t = Thread(target=func, args=(i,)) t.start() t_lst.append(p) for i in t_lst: i.join() print(‘********‘, time.time()-start)對於高計算任務,多線程高出多進程幾個數量級
4.數據隔離性測試
from threading import Thread n =100 def func(): global n n -= 1 t = Thread(target=func) t.start() t.join() print(n)數據隔離,線程共享進程資源
5.子進程和主進程
from threading import Thread,currentThread import time def func(): time.sleep(1) print(‘子進程‘, currentThread()) t = Thread(target=func) t.start() print(‘主進程‘, currentThread()) # 主線程結束意味著主進程結束,主線程會等著子線程結束才結束主線程結束意味著主進程結束,主線程會等著子線程結束才結束
6.全局解釋器鎖GIL
python全棧開發day34-線程Thread