在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 PyTorch预训练示例
Feb 11 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
python中pika模块问题的深入探究
Oct 13 Python
利用Python正则表达式过滤敏感词的方法
Jan 21 Python
Python3实现定时任务的四种方式
Jun 03 Python
python替换字符串中的子串图文步骤
Jun 19 Python
python求最大值最小值方法总结
Jun 25 Python
python实现一个函数版的名片管理系统过程解析
Aug 27 Python
PyCharm中配置PySide2的图文教程
Jun 18 Python
pycharm进入时每次都是insert模式的解决方式
Feb 05 Python
python 制作本地应用搜索工具
Feb 27 Python
virtualenv隔离Python环境的问题解析
Jun 21 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
实现 win2003 下 mysql 数据库每天自动备份
2006/12/06 PHP
php $_ENV为空的原因分析
2009/06/01 PHP
php实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
2016/11/09 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
Python实现购物程序思路及代码
2017/07/24 Python
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
Python批量生成幻影坦克图片实例代码
2019/06/04 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
python 深度学习中的4种激活函数
2020/09/18 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
struct和class的区别
2015/11/20 面试题
高中生学习总结的自我评价范文
2013/10/13 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
亮化工程实施方案
2014/03/17 职场文书
团委竞选演讲稿
2014/04/24 职场文书
保护环境倡议书300字
2014/05/19 职场文书
化妆品活动策划方案
2014/05/23 职场文书
社会发展项目建议书
2014/08/25 职场文书
2014年转正工作总结
2014/11/08 职场文书
市场营销计划书
2015/01/17 职场文书
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏
Golang 结构体数据集合
2022/04/22 Golang