中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django如何使用asyncio協程和ThreadPoolExecutor多線程

發布時間:2020-10-19 09:06:10 來源:腳本之家 閱讀:691 作者:傻白甜++ 欄目:開發技術

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

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

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)實現協程
    """
    self.id = 5
    start_time = time.time()
 
    '''
    # 同步執行
    # 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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海城市| 塘沽区| 海阳市| 廉江市| 张家川| 衡东县| 塘沽区| 三台县| 镇平县| 兴文县| 苗栗县| 延吉市| 葵青区| 临城县| 洪江市| 贵溪市| 顺昌县| 宿迁市| 石楼县| 东乌| 太谷县| 奎屯市| 吴江市| 都匀市| 隆尧县| 麦盖提县| 寻甸| 灵宝市| 安平县| 岳阳县| 吴堡县| 甘肃省| 蒙城县| 姚安县| 彰武县| 泰安市| 鄂伦春自治旗| 山东省| 泽库县| 图们市| 米林县|