Django如何使用asyncio协程和ThreadPoolExecutor多线程


Posted in Python onOctober 12, 2020

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基础知识小结之集合
Nov 25 Python
python读取与写入csv格式文件的示例代码
Dec 16 Python
python数据分析数据标准化及离散化详解
Feb 26 Python
详解Python用户登录接口的方法
Apr 17 Python
python pytest进阶之fixture详解
Jun 27 Python
pip指定python位置安装软件包的方法
Jul 12 Python
wxpython绘制圆角窗体
Nov 18 Python
Python高阶函数、常用内置函数用法实例分析
Dec 26 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
Django框架models使用group by详解
Mar 11 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
Aug 07 Python
Django如何批量创建Model
Sep 01 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
Oct 12 #Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 #Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 #Python
Python Sqlalchemy如何实现select for update
Oct 12 #Python
浅析PyCharm 的初始设置(知道)
Oct 12 #Python
Pandas替换及部分替换(replace)实现流程详解
Oct 12 #Python
Django windows使用Apache实现部署流程解析
Oct 12 #Python
You might like
php设计模式 State (状态模式)
2011/06/26 PHP
Smarty中调用FCKeditor的方法
2014/10/27 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
2011/07/31 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
2015/02/28 Javascript
jQuery插件MixItUp实现动画过滤和排序
2015/04/12 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
JS 组件系列之BootstrapTable的treegrid功能
2017/06/16 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
vue项目中的webpack-dev-sever配置方法
2017/12/14 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
Vuex的实战使用详解
2019/10/31 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
python中Mako库实例用法
2020/12/31 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
Fanatics官网:运动服装、球衣、运动装备
2020/10/12 全球购物
英语专业学生个人求职信范文
2014/01/06 职场文书
追悼会上的答谢词
2014/01/10 职场文书
营销团队口号
2014/06/06 职场文书
单位委托书怎么写
2014/09/21 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
初中地理教学反思
2016/02/19 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python