在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中list循环语句用法实例
Nov 10 Python
python创建进程fork用法
Jun 04 Python
微信跳一跳小游戏python脚本
Jan 05 Python
Python实现XML文件解析的示例代码
Feb 05 Python
如何用python整理附件
May 13 Python
对python sklearn one-hot编码详解
Jul 10 Python
详解python解压压缩包的五种方法
Jul 05 Python
Python代码一键转Jar包及Java调用Python新姿势
Mar 10 Python
浅析Python 条件控制语句
Jul 15 Python
python实现mask矩阵示例(根据列表所给元素)
Jul 30 Python
详解如何在PyCharm控制台中输出彩色文字和背景
Aug 17 Python
python 调用js的四种方式
Apr 11 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去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
JavaScript 替换Html标签实现代码
2009/10/14 Javascript
js 文件引入实现代码
2010/04/23 Javascript
js 实现日期灵活格式化的小例子
2013/07/14 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
2014/04/15 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
[08:08]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY
2014/06/25 DOTA
[01:02:47]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
python如何通过protobuf实现rpc
2016/03/06 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
如何学习Python time模块
2020/06/03 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
香港演唱会订票网站:StubHub香港
2019/10/10 全球购物
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
医药代表个人的求职信分享
2013/12/08 职场文书
大学生活动策划方案
2014/02/10 职场文书
模特大赛策划方案
2014/05/28 职场文书
工地材料员岗位职责
2015/04/11 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL