在Django的View中使用asyncio的方法


Posted in Python onJuly 12, 2019

起步

Django 是个同步框架,本文并不是 让 Django 变成异步框架。而是对于在一个 view 中需要请求多次 http api 的场景。

一个简单的例子

例子来源于 https://stackoverflow.com/questions/44667242/python-asyncio-in-django-view :

def djangoview(request, language1, language2):
 async def main(language1, language2):
  loop = asyncio.get_event_loop()
  r = sr.Recognizer()
  with sr.AudioFile(path.join(os.getcwd(), "audio.wav")) as source:
   audio = r.record(source)
  def reco_ibm(lang):
   return(r.recognize_ibm(audio, key, secret language=lang, show_all=True))
  future1 = loop.run_in_executor(None, reco_ibm, str(language1))
  future2 = loop.run_in_executor(None, reco_ibm, str(language2))
  response1 = await future1
  response2 = await future2
 loop = asyncio.new_event_loop()
 asyncio.set_event_loop(loop)
 loop = asyncio.get_event_loop()
 loop.run_until_complete(main(language1, language2))
 loop.close()
 return(HttpResponse)

这个例子中,把两个任务放到 asyncio 的 loop 运行,等到两个任务都完成了再返回 HttpResponse 。

在 Django 的 View 中使用 asyncio

现在可以对于上面的例子做一个扩充,让它能更合理被使用。

对于使用 asyncio ,我们通常会创建个子线程专门处理异步任务。

在 wsgi.py 中创建一个单独线程并运行事件循环:

import asyncio
import threading

...
application = get_wsgi_application()

# 创建子线程并等待
thread_loop = asyncio.new_event_loop()
def start_loop(loop):
 asyncio.set_event_loop(loop)
 loop.run_forever()

t = threading.Thread(target=start_loop, args=(thread_loop,), daemon=True)
t.start()

然后就是在 view 中动态向里面添加任务了:

async def fetch(url):
  async with aiohttp.ClientSession() as session:
   async with session.get(url) as response:
    text = await response.text()
    return text

def hello(request):
 from yeezy_bot.wsgi import thread_loop

 fut1 = asyncio.run_coroutine_threadsafe(fetch(url1), thread_loop)
 fut2 = asyncio.run_coroutine_threadsafe(fetch(url2), thread_loop)

 ret1 = fut1.result()
 ret2 = fut2.result()
 return HttpResponse('')

asyncio.run_coroutine_threadsafe() 返回是 Future 对象,因此可以通过 fut.result() 获得任务的运行结果。 这个方式也可以处理API请求中的数据依赖的先后顺序。

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

Python 相关文章推荐
python判断windows系统是32位还是64位的方法
May 11 Python
CentOS中升级Python版本的方法详解
Jul 10 Python
Python实现购物程序思路及代码
Jul 24 Python
Python单元测试实例详解
May 25 Python
Python应用领域和就业形势分析总结
May 14 Python
python的等深分箱实例
Nov 22 Python
python super用法及原理详解
Jan 20 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
Feb 20 Python
python有几个版本
Jun 17 Python
浅谈Python描述数据结构之KMP篇
Sep 06 Python
python 实现体质指数BMI计算
May 26 Python
python之PySide2安装使用及QT Designer UI设计案例教程
Jul 26 Python
检测python爬虫时是否代理ip伪装成功的方法
Jul 12 #Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 #Python
基于sklearn实现Bagging算法(python)
Jul 11 #Python
Python的log日志功能及设置方法
Jul 11 #Python
python使用装饰器作日志处理的方法
Jul 11 #Python
Python日志无延迟实时写入的示例
Jul 11 #Python
深入了解Python iter() 方法的用法
Jul 11 #Python
You might like
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
js对象基础实例分析
2015/01/13 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
JS快速实现移动端拼图游戏
2016/09/05 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
js实现返回顶部效果
2017/03/10 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
vue自定义filters过滤器
2018/04/26 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
python requests更换代理适用于IP频率限制的方法
2019/08/21 Python
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
采购经理岗位职责
2014/02/16 职场文书
协议书范本
2014/04/23 职场文书
加入学生会演讲稿
2014/04/24 职场文书
预备党员综合考察材料
2014/05/31 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书
Elasticsearch 聚合查询和排序
2022/04/19 Python
SQL Server删除表中的重复数据
2022/05/25 SQL Server