python非同步程式設計-執行緒非同步
阿新 • • 發佈:2018-11-21
一.為何要用到非同步
博主在工作中遇到了以下問題,開發介面爬取資料程式碼完成之後要寫入快取,但是伺服器頻寬不是很高,在存入資料庫的過程花費2-5s(io延遲),這樣就大大影響了介面的效能,於是想到了使用非同步儲存。
二.瞭解非同步程式設計
- 為完成某個任務,不同程式單元之間過程中無需通訊協調,也能完成任務的方式。
- 不相關的程式單元之間可以是非同步的。
- 例如,爬蟲下載網頁。排程程式呼叫下載程式後,即可排程其他任務,而無需與該下載任務保持通訊以協調行為。不同網頁的下載、儲存等操作都是無關的,也無需相互通知協調。這些非同步操作的完成時刻並不確。
三.執行緒非同步
原理:使用執行緒類threading.Thread呼叫函式
應用:通過執行緒呼叫的方式,來達到非同步非阻塞的效果,也就是說主程式無需等待執行緒執行完畢,仍然可以繼續向下執行。
Python多執行緒詳解:https://www.cnblogs.com/tkqasn/p/5700281.html
程式碼例項:
同步阻塞程式碼
1 import threading,time 2 3 def thead(num): 4 time.sleep(1) 5 print("阻塞程式%s開始執行"%num) 6 time.sleep(3) 7 print("阻塞程式%s執行完畢"%num)8 9 def main(): 10 print("主方法開始執行") 11 12 for i in range(1,3): 13 thead(i) 14 15 print("主方法執行完畢") 16 return 17 18 if __name__ == '__main__': 19 print(time.ctime()) 20 num = main() 21 print("返回結果為%s"%num) 22 print(time.ctime())
Wed Nov 21 09:22:56 2018 主方法開始執行 阻塞程式1開始執行 阻塞程式1執行完畢 阻塞程式2開始執行 阻塞程式2執行完畢 主方法執行完畢 返回結果為None Wed Nov21 09:23:04 2018
執行緒非同步,無需等待執行緒執行
import threading,time
def thead(num):
# time.sleep(1)
print("執行緒%s開始執行"%num)
time.sleep(3)
print("執行緒%s執行完畢"%num)
def main():
print("主方法開始執行")
#建立2個執行緒
poll = []#執行緒池
for i in range(1,3):
thead_one = threading.Thread(target=thead, args=(i,))
poll.append(thead_one) #執行緒池新增執行緒
for n in poll:
n.start() #準備就緒,等待cpu執行
print("主方法執行完畢")
return
if __name__ == '__main__':
print(time.ctime())
num = main()
print("返回結果為%s"%num)
print(time.ctime())
Wed Nov 21 09:48:00 2018
主方法開始執行
主方法執行完畢
返回結果為None
Wed Nov 21 09:48:00 2018
執行緒1開始執行
執行緒2開始執行
執行緒1執行完畢
執行緒2執行完畢
以上程式碼是在python3.5版本測試執行。實際工作中可能會遇到一些bug,暫時還沒發現。
介面得到資料和寫入快取分開來做,避免了IO操作延時,介面響應時間縮短,這樣我的目的就達到了。
第一次接觸非同步的概念,在網上了解到了一些非同步模組asyncio,python非同步程式設計的概念,還有很多需要學習的地方,所以後續還會繼續更新此類部落格。