在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-基础-入门 简介
Aug 09 Python
Python函数参数类型*、**的区别
Apr 11 Python
Python for Informatics 第11章之正则表达式(四)
Apr 21 Python
Python抓取框架 Scrapy的架构
Aug 12 Python
解析Python中的eval()、exec()及其相关函数
Dec 20 Python
python实现学生信息管理系统
Apr 05 Python
Python操作MySQL数据库的方法
Jun 20 Python
Python操作SQLite/MySQL/LMDB数据库的方法
Nov 07 Python
Django连接数据库并实现读写分离过程解析
Nov 13 Python
python实现简易版学生成绩管理系统
Jun 22 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
python 指定源路径来解决import问题的操作
Mar 04 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使用websocket示例详解
2014/03/12 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
2014/10/20 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
Laravel搭建后台登录系统步骤详解
2016/07/26 PHP
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
28个JS验证函数收集
2010/03/02 Javascript
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
jquery中子元素和后代元素的区别示例介绍
2014/04/02 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
2016/01/22 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
Node.js 使用jade模板引擎的示例
2018/05/11 Javascript
微信小程序倒计时功能实例代码
2018/07/17 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
python 正确保留多位小数的实例
2018/07/16 Python
Django-rest-framework中过滤器的定制实例
2020/04/01 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
加拿大床上用品、家居装饰、厨房和浴室产品购物网站:Linen Chest
2018/06/05 全球购物
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
分布式数据库需要考虑哪些问题
2013/12/08 面试题
《植物妈妈有办法》教学反思
2014/02/25 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
婚礼父母答谢词
2015/01/04 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
导游词之北京明十三陵
2019/10/28 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python
mybatis源码解读之executor包语句处理功能
2022/02/15 Java/Android