在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 相关文章推荐
基于wxpython开发的简单gui计算器实例
May 30 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
Nov 15 Python
python爬取网易云音乐评论
Nov 16 Python
python 二维数组90度旋转的方法
Jan 28 Python
Python中整数的缓存机制讲解
Feb 16 Python
Python深拷贝与浅拷贝用法实例分析
May 05 Python
Python调用C语言的实现
Jul 26 Python
Python导入模块包原理及相关注意事项
Mar 25 Python
Python基于Hypothesis测试库生成测试数据
Apr 29 Python
python用字节处理文件实例讲解
Apr 13 Python
python之json文件转xml文件案例讲解
Aug 07 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
将文件夹压缩成zip文件的php代码
2009/12/14 PHP
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
php中curl使用指南
2015/02/05 PHP
php操作MongoDB类实例
2015/06/17 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
PHP微信支付实例解析
2016/07/22 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
jQuery实现点击查看大图并以弹框的形式居中
2016/08/08 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
2019/06/20 Javascript
javascript移动端 电子书 翻页效果实现代码
2019/09/07 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
详谈vue中router-link和传统a链接的区别
2020/07/22 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
Python中的高级数据结构详解
2015/03/27 Python
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
Python中logging实例讲解
2019/01/17 Python
基于python实现高速视频传输程序
2019/05/05 Python
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
倩碧澳大利亚官网:Clinique澳大利亚
2019/07/22 全球购物
门诊挂号室室长岗位职责
2013/11/27 职场文书
失业者真诚求职信范文
2013/12/25 职场文书
出国留学计划书
2014/04/27 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
关键在于落实心得体会
2014/09/03 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python