在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实现在Linux系统下更改当前进程运行用户
Feb 04 Python
python回调函数用法实例分析
May 09 Python
网站渗透常用Python小脚本查询同ip网站
May 08 Python
Python基于回溯法子集树模板实现图的遍历功能示例
Sep 05 Python
python读取中文txt文本的方法
Apr 12 Python
Python学习笔记之Django创建第一个数据库模型的方法
Aug 07 Python
django 多对多表的创建和插入代码实现
Sep 09 Python
python之生成多层json结构的实现
Feb 27 Python
Python如何用wx模块创建文本编辑器
Jun 07 Python
python selenium xpath定位操作
Sep 01 Python
Python 调用C++封装的进一步探索交流
Mar 04 Python
Python利用机器学习算法实现垃圾邮件的识别
Jun 28 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 远程文件管理,可以给表格排序,遍历目录,时间排序
2009/08/07 PHP
一个简单php扩展介绍与开发教程
2010/08/19 PHP
php生成二维码图片方法汇总
2016/12/17 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
js 设置选中行的样式的实现代码
2010/05/24 Javascript
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
详解参数传递四种形式
2015/07/21 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
JavaScript+CSS无限极分类效果完整实现方法
2015/12/22 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
实例分析JS与Node.js中的事件循环
2017/12/12 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
2020/05/26 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
Python部署web开发程序的几种方法
2017/05/05 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
解决python报错MemoryError的问题
2018/06/26 Python
python 处理string到hex脚本的方法
2018/10/26 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
python程序快速缩进多行代码方法总结
2019/06/23 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
Python 实现使用空值进行赋值 None
2020/03/12 Python
零基础小白多久能学会python
2020/06/22 Python
HTML5新特性之语义化标签
2017/10/31 HTML / CSS
家长会主持词开场白
2014/03/18 职场文书
幸福中国演讲稿
2014/09/12 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js
华为HarmonyOS3.0强在哪? 看看鸿蒙3.0这7个小功能
2023/01/09 数码科技