Django使用協程創建數據


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分半。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM