Django使用協程創建數據
-
首先創建一個django工程,必要的表,此處省略
-
在MySQL添加數據:大概是10萬條數據
delimiter $$ create procedure ttst() begin declare i int default 0; while i < 1000000 do insert into api_data (name) values("nameJams"); set i = i + 1; end while; end $$ delimiter ; call ttst(); -
這樣執行完
ttst()執行時間如下:
-
刪除存儲過程函數
drop FUNCTION if exists insertSomeData;#insertSomeData函數名 刪除存儲過程函數 drop PROCEDURE if exists insertSomeData;# 刪除存儲過程 -
定義查詢存入數據的存儲過程
# 指定界定符 delimiter $$ #創建存儲過程 create procedure selectCountData() begin # 執行sql語句 select count(*) from api_data; end $$ # 重置界定符 delimiter ; # 通過call 調用存儲過程 call selectCountData(); -
這樣我們在調用
call selectCountData();可以查看數據多少條。 -
django代碼實現:
import time import asyncio from django.db import connection class getData(APIView): def get(self,request,*args,**kwargs): start = time.time() count = 100000 # 創建一個新的事件循環 loop = asyncio.new_event_loop() # 將 loop 設置為當前 OS 線程的當前事件循環。 asyncio.set_event_loop(loop) self.loop = loop try: # 將任務對象注冊到事件循環隊列中並且開啟了事件循環 results = loop.run_until_complete(self.gather_tasks(list(range(count)))) finally: loop.close() print(results) end = time.time() return Response({"code":200,"count":len(results),"msg":"獲取數據成功","time":end-start}) async def gather_tasks(self,limit_list): # 創建task任務 task = (self.select_data(self.current_sql,item) for item in limit_list) # 接受task任務 results = await asyncio.gather(*task) return results async def select_data(self, func, *args): # 可以是 ThreadPoolExecutor / ProcessPool , 如果是None 則使用默認線程池 future = self.loop.run_in_executor(None, func, *args) response = await future return response def current_sql(self, size_list): # Lock.acquire() with connection.cursor() as cursor: # 此處對於分頁查詢,進行優化 where id > xxx 可以縮小范圍 res = cursor.execute("INSERT INTO api_data (name) VALUES({})".format(size_list)) return res- 執行插入十萬條數據,返回結果如下:

- 可以看到,執行時間1分半,比4分鍾少了2分半。
