范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

一代版本一代神,Docker在Win10极速体验Django3。1真实异步

  就在去年(2019年),Django官方发布3.0版本,内核升级宣布支持Asgi,这一重磅消息让无数后台研发人员欢呼雀跃,弹冠相庆。大喜过望之下,小伙伴们兴奋的开箱试用,结果却让人大跌眼镜:非但说好的内部集成Websocket没有出现,就连原生的异步通信功能也只是个壳子,内部并未实现,很明显的换汤不换药,这让不少人转身投入了FastAPI的怀抱。不过一年之后,今天8月,Django3.1版本姗姗来迟,这个新版本终于一代封神,不仅支持原生的异步视图,同时也支持异步中间件,明显整了个大活。
  本次我们利用Docker制作一款基于Django3.1.1的项目镜像,实际体验一下Django原生异步的魅力。
  首先在宿主机安装新版Django pip install Django==3.1.1
  新建一个项目,名字为django31 django-admin.py startproject django31 .
  进入项目目录可以发现,熟悉的入口文件mange.py已经消失不见,新增了asgi.py文件用来启动项目,这里我们使用异步服务器uvicorn来启动新版Django,而uvicorn对windows系统支持不够友好,所以使用Docker来构建一个运行镜像,简单方便,进入django31目录,新建Dockerfile: FROM python:3.7 WORKDIR /Project/django31  COPY requirements.txt ./ RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple  COPY . . ENV LANG C.UTF-8 WORKDIR /Project CMD ["uvicorn", "django31.asgi:application","--host","0.0.0.0"]
  这里需要注意一点,Docker每创建一个容器,会在iptables中添加一个规则,每个容器都会在本机127.17.X.X范围内分配一个地址,容器绑定的主机端口会映射到本机的127.17.X.X的容器抛出端口上。所以容器内部的项目绑定的ip不能是127.0.0.1,要绑定为0.0.0.0,这样绑定后容器内部app的实际ip由Docker自动分配,所以这里uvicorn启动参数需要用host强制绑定为0.0.0.0。
  随后在项目中创建依赖文件requirements.txt: django==3.1.1 uvicorn httpx
  开始编译镜像文件: docker build -t "django31" .
  编译成功后大概1g左右 liuyue:django31 liuyue$ docker images REPOSITORY                  TAG                   IMAGE ID            CREATED             SIZE django31                    latest                e8afbbbb9305        30 minutes ago      919MB
  然后我们来启动项目: docker run -it --rm -p 8000:8000 django31
  后台显示启动顺利,绑定在容器内的0.0.0.0: liuyue:django31 liuyue$ docker run -it --rm -p 8000:8000 django31 INFO:     Started server process [1] INFO:     Waiting for application startup. INFO:     ASGI "lifespan" protocol appears unsupported. INFO:     Application startup complete. INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
  浏览器访问:http://localhost:8000
  熟悉的小火箭又起飞了,接下来我们来编写第一个异步视图views.py from django.http import HttpResponse async def index(request):     return HttpResponse("异步视图")
  修改一下路由文件urls.py from django.contrib import admin from django.urls import path from django31.views import index  urlpatterns = [     path("admin/", admin.site.urls),     path("", index) ]
  重新编译镜像: docker build -t "django31" . docker run -it --rm -p 8000:8000 django31
  访问http://localhost:8000
  没有问题,还记得去年我们曾经使用Siege对Django2.0版本进行压力测试吗?现在我们再来测一下 siege -c150 -t60S -v -b 127.0.0.1:8000
  150个并发持续一分钟,看看新版Django的抗压能力怎么样: liuyue:~ liuyue$ siege -c150 -t60S -v -b 127.0.0.1:8000  {	"transactions":			       10517, 	"availability":			      100.00, 	"elapsed_time":			       59.70, 	"data_transferred":		        0.12, 	"response_time":		        0.84, 	"transaction_rate":		      176.16, 	"throughput":			        0.00, 	"concurrency":			      148.58, 	"successful_transactions":	       10517, 	"failed_transactions":		           0, 	"longest_transaction":		        1.13, 	"shortest_transaction":		        0.45 } liuyue:~ liuyue$
  从测试结果看,整体性能虽然没有质的提高,但是也还算是差强人意,乞丐级主机在uvicorn的加持下单机200个左右并发还是能抗住的。
  接下来我们来体验一下真正的技术,Django内置的原生异步任务,分别同步和异步两种方式使用httpx来请求接口,方法中人为的阻塞10秒钟: from django.http import HttpResponse  import asyncio from time import sleep import httpx #异步请求 async def http_call_async():     for num in range(10):         await asyncio.sleep(1)         print(num)     async with httpx.AsyncClient() as client:         r = await client.get("https://v3u.cn")         print(r)  #同步请求 def http_call_sync():     for num in range(10):         sleep(1)         print(num)     r = httpx.get("https://v3u.cn")     print(r)
  再分别通过同步和异步视图进行调用: async def async_view(request):     loop = asyncio.get_event_loop()     loop.create_task(http_call_async())     return HttpResponse("非阻塞视图")   def sync_view(request):     http_call_sync()     return HttpResponse("阻塞视图")
  修改路由: from django.contrib import admin from django.urls import path from django31.views import index, async_view, sync_view  urlpatterns = [     path("admin/", admin.site.urls),     path("", index),     path("async/", async_view),     path("sync/", sync_view), ]
  重新编译: docker build -t "django31" . docker run -it --rm -p 8000:8000 django31
  访问 http://localhost:8000/sync/ 看看同步的效率
  很明显过程中阻塞了10秒,然后我们才等到页面结果:
  再来试试不一样的,访问http://localhost:8000/async/
  16毫秒,无视阻塞,瞬间响应。
  通过动图我们可以发现,后端还在执行阻塞任务,但是前段已经通过异步多路复用将请求任务结果返回至浏览器了。
  虽然这已经很不错了,但是稍有遗憾的是,目前Django内置的ORM还是同步机制,也就是说当我们读写数据库的时候还是阻塞状态,此时的场景就是异步视图内塞入了同步操作,这该怎么办呢?可以使用内置的sync_to_async方法进行转化: from asgiref.sync import sync_to_async async def async_with_sync_view(request):     loop = asyncio.get_event_loop()     async_function = sync_to_async(http_call_sync)     loop.create_task(async_function())     return HttpResponse("(via sync_to_async)")
  由此可见,Django3.1在异步层面真的开始秀操作了,这就带来另外一个问题,既然原生异步任务已经做得这么牛逼了,我们到底还有没有必要使用Celery?
  其实关于Django的异步视图只是提供了类似于任务或消息队列的功能,但功能上并没有Celery强大。如果你正在使用(或者正在考虑)Django3.1,并且想做一些简单的事情(并且不关心可靠性),异步视图是一种快速、简单地完成这个任务的好方法。如果你需要执行重得多的、长期运行的后台进程,你还是要使用Celery。
  简而言之,Django3.1的异步任务目前仅仅是解决Celery过重的一个简化方案而已。
  结语:假如我们说,新世纪以来Python在Web开发界有什么成就,无疑的,我们应该说,Django和Flask是两个颠扑不破的巨石重镇,没有了它们,Python的web开发史上便要黯然失光,Django作为第一web开发框架,要文档有文档,要功能有功能,腰斩对手于马下,敏捷开发利器。Django3.1的发布仿佛把我们又拉回到了Django一统江湖的年代,那个美好的时代,让无数人午夜梦回。

平均日入近万,男子弃百万年薪种红薯3年挣350万,成功可复制?三年种植红薯350万美元。你能相信吗?河南兰考的张先生放弃了一线城市的百万年薪,回到家乡创业种红薯。投入了100万,第一年没有影子,第二年仍然亏损,第三年竟然赚了350万。男子弃百小米新专利公示手机摄像头凸起有救了不知道从什么时候开始,手机后壳的摄像头数量越来越多,也越来越突出,到了现在,想要手机平着放在桌子上都已经成为了奢望。近日,一项由北京小米移动软件有限公司申请,名叫摄像头模组及终端设日本终于忍不住了,正式向美元宣战日元暴跌,日本央行终于被美联储逼急了!时隔24年出手干预,正式向美元宣战!今年以来,日元兑美元大幅贬值,曾经创下单日贬值10000多个基点的暴跌幅度。日元兑美元快速贬值危害很大,导全新斯柯达明锐纯电版曝光,有望于2030年内正式亮相IT之家9月25日消息,明锐Octavia是斯柯达最畅销的系列,此前已在2020年突破了700万辆的销量大关。最新消息表明,纯电新车可能会在2025年后,到2030年底前的一段时间苹果紧急发布iOS16。0。2正式版,到底修复了什么?文明美无限随着iPhone14系列机型发布后,苹果也同步上线了iOS16系统,但新系统刚推出,就被不少追新的用户吐槽,其中存在的很多小BUG,着实有些影响使用。这不9月23日,苹果事关鸿蒙系统,工信部正式发声,华为不再孤立无援央视曾评价华为鸿蒙系统有望打破操作系统垄断。能获得央视全程陪跑的国产操作系统,恐怕只有华为发布的鸿蒙系统了吧。在鸿蒙上线时,央视就对其进行了特别报道。在升级用户超过5000万后,央正式发布!大连太平湾合作创新区产业发展规划近日,大连太平湾合作创新区产业发展规划(20212035)正式发布,这标志着太平湾合作创新区产业发展将正式步入快速发展新阶段。战略目标打造东北新特区战略目标打造东北新特区太平湾合作儿童时期我们的视力是怎样的?眼睛同我们的身高一样,也是需要经历一个成长成熟的过程,不同年龄阶段视力状况是不一样的。儿童视力发育通过上图我们可以发现,当儿童年龄比较小的时候,他是看不清楚远处的物体的。正因如此,看到这些,我泪目了看到这儿,我想起我的月嫂今天看到一位宝妈发的篇文章,月嫂在离开之前给她做了好多吃的,有包子,饺子放到冰箱里,怕她离开以后,宝妈没时间做饭,饿着自己!这位宝妈很是感动!看到这儿。我想起我的月嫂王姐。我生老大黄圣依杨子已离婚上热搜!网友早有预言,评论区已沦陷黄圣依和杨子离婚的瓜,今天突然上热搜,看似莫名其妙,实则内有玄机。有网友发现了黄圣依和杨子一个月前,在微博上发布的文案,好像是官宣离婚。只不过因为是藏头诗,太隐晦,当时没引起网友注好莱坞红毯太大胆,只有你想不到的,没有她们不敢穿的纵观国外红毯走秀,那是奇葩朵朵开,让人开了眼,各路明星手握流量密码,一出场便是焦点。从大胆透视装到让人垂涎三尺的汉堡服,从致敬经典到玩梗COSPLAY,盘点近年来的大胆造型,只有你
怀斯曼3换1交易即将达成!勇士获强力中锋开启连冠,马刺赢下未来上赛季勇士王者归来,季后赛接连淘汰掘金灰熊以及独行侠挺进总决赛,并且在总决赛当中战胜了凯尔特人成功获得总冠军。勇士从无缘季后赛到获得总冠军仅仅用了三个赛季,而库里也重回巅峰,下赛季深夜0点!丁彦雨航长篇感人发声5次提山东,球迷彻底破防在丁彦雨航宣布自己正式签约上海男篮之后,仅仅过了6个小时,小丁又在个人社交媒体上发声,长达几百字的言语中,没有任何抱怨和不满,5次提到山东透露着对山东男篮这片热土的感恩,令球迷看了国乒喜讯!刘诗雯新职位已确认,孙颖莎终于等到了,球迷拍手叫好今天是北京时间的八月二十九号,目前我们的国乒已经正式来到了成都来备战接下来的世乒赛。因为世乒赛是国乒非常重要的赛事,而且我们本次可是东道主。其实本次世乒赛最受关注的莫过于刘诗雯了。国常会听取国务院第九次大督查情况汇报要求狠抓政策落实推动经济回稳向上李克强主持召开国务院常务会议,听取国务院第九次大督查情况汇报,要求狠抓政策落实推动经济回稳向上。会议指出,围绕落实党中央国务院部署,近期国务院对部分地区开展大督查。着力督导检查稳经家用SUV选谁不出错?奇骏对比CRV,全面好用才靠谱对于广大中国家庭用户而言,紧凑型SUV一直以来都是合适的购车之选,它们适应性广承载能力强,更加符合中国人的用车特点。在一众紧凑型SUV当中,东风日产奇骏和东风本田CRV都是非常热门经济回暖今年8月泰国汽车销量增长61。7日前,泰国工业协会汽车联合会副主席素拉蓬透露,2022年8月泰国国内汽车销量达到68,208辆,同比去年同期增长了61。7,同比今年7月销量增长6。52,这主要是受新车型增加部分车随着中国女排二队的崛起,借着大婚着实高调的张常宁地位危险了张常宁真辛苦,大热天的还四处奔走,参加商务活动。中国女排正在北仑备战世锦赛,张常宁虽然因伤缺席,不过她也没闲着,她也现身某商场,出席商务活动,吸引了大批球迷围观,也算是推广了排球运弗里克拜仁国脚都渴望为国家队效力,他们有能力令拜仁重返正轨直播吧9月22日讯北京时间9月24日,欧国联A级第5轮,德国主场迎战匈牙利。赛前,德国主帅弗里克在新闻发布会上谈到了在拜仁效力的德国国脚。目前拜仁在德甲战绩低迷,关于效力拜仁的德国中国代表30余国反对联合国人权理事会第51届会议21日就包括经济社会文化权利和发展权在内的专题性人权问题举行一般性辩论。中国常驻联合国日内瓦办事处和瑞士其他国际组织代表陈旭大使代表30余国作共同发言,在大军区军政主官岗位上的开国校官,数以万计中只有13位殊为不易文水新营新中国成立后,无论是早期的解放军六大军区,还是后来的十三及十一个大军区,军政主官大都是由开国将帅担任。进入上世纪80年代以后,开国校官才开始走上大军区军政主官的岗位。据统计安徽省宿州市中级人民法院原党组书记院长戚怀民被开除党籍中央纪委国家监委网站讯据安徽省纪委监委消息日前,经中共安徽省委批准,安徽省纪委监委对宿州市中级人民法院原党组书记院长戚怀民严重违纪违法问题进行了立案审查调查。经查,戚怀民背离党性原