最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django如何使用asyncio協(xié)程和ThreadPoolExecutor多線程

 更新時間:2020年10月12日 10:53:58   作者:傻白甜++  
這篇文章主要介紹了Django如何使用asyncio協(xié)程和ThreadPoolExecutor多線程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

Django視圖函數(shù)執(zhí)行,不在主線程中,直接loop = asyncio.new_event_loop()
# 不能loop = asyncio.get_event_loop() 會觸發(fā)RuntimeError: There is no current event loop in thread

因為asyncio程序中的每個線程都有自己的事件循環(huán),但它只會在主線程中為你自動創(chuàng)建一個事件循環(huán)。所以如果你asyncio.get_event_loop在主線程中調用一次,它將自動創(chuàng)建一個循環(huán)對象并將其設置為默認值,但是如果你在一個子線程中再次調用它,你會得到這個錯誤。相反,您需要在線程啟動時顯式創(chuàng)建/設置事件循環(huán):

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

在Django單個視圖中使用asyncio實例代碼如下(有多個IO任務時)

from django.views import View
import asyncio
import time
from django.http import JsonResponse
 
 
class TestAsyncioView(View):
  def get(self, request, *args, **kwargs):
    """
    利用asyncio和async await關鍵字(python3.5之前使用yield)實現(xiàn)協(xié)程
    """
    self.id = 5
    start_time = time.time()
 
    '''
    # 同步執(zhí)行
    # results = [self.io_task1(self.id),
    # self.io_task2(self.id),
    # self.io_task2(self.id)]
    '''
 
 
    loop = asyncio.new_event_loop() # 或 loop = asyncio.SelectorEventLoop()
    asyncio.set_event_loop(loop)
    self.loop = loop
 
    works = [
      asyncio.ensure_future(self.io_task3(5)),
      asyncio.ensure_future(self.io_task3(5)),
      asyncio.ensure_future(self.io_task3(5)),
      asyncio.ensure_future(self.io_task3(5)),
      asyncio.ensure_future(self.io_task3(5)),
 
    ]
 
    try:
 
      results = loop.run_until_complete(asyncio.gather(*works)) # 兩種寫法
      # results = loop.run_until_complete(self.gather_tasks())
    finally:
      loop.close()
    end_time = time.time()
    return JsonResponse({'results': results, 'cost_time': (end_time - start_time)})
 
  async def gather_tasks(self):
 
    tasks = (
      self.make_future(self.io_task1, self.id),
      self.make_future(self.io_task2, self.id),
      self.make_future(self.io_task2, self.id),
      self.make_future(self.io_task1, self.id),
      self.make_future(self.io_task2, self.id),
      self.make_future(self.io_task2, self.id),
    )
    results = await asyncio.gather(*tasks)
    return results
 
  async def make_future(self, func, *args):
    future = self.loop.run_in_executor(None, func, *args)
    response = await future
    return response
 
  def io_task1(self, sleep_time):
    time.sleep(sleep_time)
    return 66
 
  def io_task2(self, sleep_time):
    time.sleep(sleep_time)
    return 77
 
  async def io_task3(self, sleep_time):
    # await asyncio.sleep(sleep_time)
    s = await self.do(sleep_time)
    return s
 
  async def do(self, sleep_time):
    await asyncio.sleep(sleep_time)
    return 66

在Django單個視圖中使用ThreadPoolExecutor實例代碼如下(有多個IO任務時)

from django.views import View
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
 
 
class TestThreadView(View):
  def get(self, request, *args, **kargs):
    start_time = time.time()
    future_set = set()
    tasks = (self.io_task1, self.io_task2, self.io_task2, self.io_task1, self.io_task2, self.io_task2)
    with ThreadPoolExecutor(len(tasks)) as executor:
      for task in tasks:
        future = executor.submit(task, 5)
        future_set.add(future)
    for future in as_completed(future_set):
      error = future.exception()
      if error is not None:
        raise error
    results = self.get_results(future_set)
    end_time = time.time()
    return JsonResponse({'results': results, 'cost_time': (end_time - start_time)})
 
  def get_results(self, future_set):
 
    results = []
    for future in future_set:
      results.append(future.result())
    return results
 
  def io_task1(self, sleep_time):
    time.sleep(sleep_time)
    return 66
 
  def io_task2(self, sleep_time):
    time.sleep(sleep_time)
    return 77

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 詳解Python nose單元測試框架的安裝與使用

    詳解Python nose單元測試框架的安裝與使用

    本篇文章主要介紹了詳解Python nose單元測試框架的安裝與使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Python變量命名規(guī)范的總結

    Python變量命名規(guī)范的總結

    在Python編程中,變量命名規(guī)范對于編寫優(yōu)雅和可維護的代碼至關重要,本文主要介紹了Python變量命名規(guī)范的總結,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 使用Python爬蟲框架獲取HTML網(wǎng)頁中指定區(qū)域的數(shù)據(jù)

    使用Python爬蟲框架獲取HTML網(wǎng)頁中指定區(qū)域的數(shù)據(jù)

    在當今互聯(lián)網(wǎng)時代,數(shù)據(jù)已經(jīng)成為了一種寶貴的資源,無論是進行市場分析、輿情監(jiān)控,還是進行學術研究,獲取網(wǎng)頁中的數(shù)據(jù)都是一個非常重要的步驟,Python提供了多種爬蟲框架來幫助我們高效地獲取網(wǎng)頁數(shù)據(jù),本文將詳細介紹如何使用Python爬蟲框架來獲取HTML網(wǎng)頁中指定區(qū)域的數(shù)據(jù)
    2025-03-03
  • 詳解python播放音頻的三種方法

    詳解python播放音頻的三種方法

    這篇文章主要介紹了python播放音頻的三種方法,每種方法通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • 弄清Pytorch顯存的分配機制

    弄清Pytorch顯存的分配機制

    這篇文章主要介紹了Pytorch顯存的分配機制的相關資料,幫助大家更好的理解和使用Pytorch,感興趣的朋友可以了解下
    2020-12-12
  • Python中的下劃線詳解

    Python中的下劃線詳解

    這篇文章主要介紹了Python中的下劃線詳解,本文講解了單個下劃線直接做變量名、單下劃線前綴的名稱、雙下劃線前綴的名稱等內容,需要的朋友可以參考下
    2015-06-06
  • Python ORM框架SQLAlchemy學習筆記之安裝和簡單查詢實例

    Python ORM框架SQLAlchemy學習筆記之安裝和簡單查詢實例

    這篇文章主要介紹了Python ORM框架SQLAlchemy學習筆記之安裝和簡單查詢實例,簡明入門教程,需要的朋友可以參考下
    2014-06-06
  • 詳解Python中__str__和__repr__方法的區(qū)別

    詳解Python中__str__和__repr__方法的區(qū)別

    這篇文章主要介紹了__str__和__repr__方法的區(qū)別 ,__str__和__repr__是基本的內置方法,使用時的區(qū)別也是Python學習當中的基礎,需要的朋友可以參考下
    2015-04-04
  • 基于PyQt5制作一個動態(tài)指針時鐘

    基于PyQt5制作一個動態(tài)指針時鐘

    這篇文章主要和大家分享如何利用Python中的PyQt5制作一個動態(tài)指針時鐘來顯示實時時間,文中的示例代碼講解詳細,需要的可以參考一下
    2022-02-02
  • python動畫manim中的顏色ManimColor的使用方法詳解

    python動畫manim中的顏色ManimColor的使用方法詳解

    這篇文章主要介紹了python動畫manim中的顏色ManimColor的使用方法,本文通過實例圖文展示給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-08-08

最新評論

精河县| 麻城市| 阿鲁科尔沁旗| 保靖县| 和田县| 鲜城| 普宁市| 新乡县| 开原市| 贡嘎县| 济阳县| 金乡县| 桃园县| 磐石市| 望城县| 固原市| 鹤岗市| 民乐县| 民县| 凤山县| 新和县| 利辛县| 新邵县| 巫溪县| 东城区| 新巴尔虎左旗| 顺义区| 五河县| 松江区| 克东县| 桐庐县| 昌乐县| 邳州市| 北辰区| 定边县| 博罗县| 铜鼓县| 临海市| 环江| 长乐市| 根河市|