在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字符遍历的艺术
Sep 06 Python
Python3使用requests包抓取并保存网页源码的方法
Mar 15 Python
Python基础知识_浅谈用户交互
May 31 Python
Python 闭包的使用方法
Sep 07 Python
python机器学习库常用汇总
Nov 15 Python
Python贪心算法实例小结
Apr 22 Python
python调用matlab的m自定义函数方法
Feb 18 Python
基于Python的图像数据增强Data Augmentation解析
Aug 13 Python
python如何将两个txt文件内容合并
Oct 18 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
利用python实现平稳时间序列的建模方式
Jun 03 Python
Python可视化学习之seaborn绘制矩阵图详解
Feb 24 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
漫威DC即将合作联动,而双方早已经秘密开始
2020/04/09 欧美动漫
如何使用脚本模仿登陆过程
2006/11/22 PHP
PHP中date()日期函数有关参数整理
2011/07/19 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
Javascript 继承实现例子
2009/08/12 Javascript
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
再探JavaScript作用域
2014/09/24 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
Angularjs中ng-repeat的简单实例
2017/08/25 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
浅谈webpack打包过程中因为图片的路径导致的问题
2018/02/21 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
python使用pil库实现图片合成实例代码
2018/01/20 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
Python 如何实现访问者模式
2020/07/28 Python
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
销售人员获奖感言
2014/02/05 职场文书
《孔繁森》教学反思
2014/04/17 职场文书
幼儿园六一儿童节活动总结
2015/02/10 职场文书
南京南京观后感
2015/06/02 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
村官2015年度工作总结
2015/10/14 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS
Linux安装Docker详细教程
2022/07/07 Servers