1. 程式人生 > >python非同步程式設計-執行緒非同步

python非同步程式設計-執行緒非同步

一.為何要用到非同步

  博主在工作中遇到了以下問題,開發介面爬取資料程式碼完成之後要寫入快取,但是伺服器頻寬不是很高,在存入資料庫的過程花費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 Nov 
21 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非同步程式設計的概念,還有很多需要學習的地方,所以後續還會繼續更新此類部落格。