在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中元类用法实例
Oct 10 Python
Python中使用第三方库xlrd来写入Excel文件示例
Apr 05 Python
python类和函数中使用静态变量的方法
May 09 Python
Python操作mysql数据库实现增删查改功能的方法
Jan 15 Python
python web.py开发httpserver解决跨域问题实例解析
Feb 12 Python
python使用Plotly绘图工具绘制水平条形图
Mar 25 Python
对python中GUI,Label和Button的实例详解
Jun 27 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
Aug 24 Python
Python获取时间戳代码实例
Sep 24 Python
python自动点赞功能的实现思路
Feb 26 Python
Python 存取npy格式数据实例
Jul 01 Python
python实现调用摄像头并拍照发邮箱
Apr 27 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模板,主要想体现一下思路
2006/12/25 PHP
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
2016/04/02 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
Javascript弹出窗口的各种方法总结
2013/11/11 Javascript
jquery选择器需要注意的问题
2014/11/26 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
学习jQuery中的noConflict()用法
2018/09/28 jQuery
vue无限轮播插件代码实例
2019/05/10 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
Python深入学习之上下文管理器
2014/08/31 Python
wxPython之wx.DC绘制形状
2019/11/19 Python
python环境下安装opencv库的方法
2020/03/05 Python
Jupyter notebook如何实现指定浏览器打开
2020/05/13 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
详解HTML5通讯录获取指定多个人的信息
2016/12/20 HTML / CSS
渡河少年教学反思
2014/02/12 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
公司开业庆典主持词
2014/03/21 职场文书
分公司负责人任命书
2014/06/04 职场文书
单位消防安全责任书
2014/07/23 职场文书
作风大整顿心得体会
2014/09/10 职场文书
2014年接待工作总结
2014/11/26 职场文书
高校自主招生校长推荐信
2015/03/23 职场文书
社区重阳节活动总结
2015/03/24 职场文书
百家讲坛观后感
2015/06/12 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书