当前位置: 首页 > 网络应用技术

为什么Django不是异步(2023年的最新饰面)

时间:2023-03-06 21:49:47 网络应用技术

  简介:许多朋友问有关Django为什么不是异步的问题。本文的首席执行官注释将为您提供一个详细的答案,以供所有人参考。我希望这对每个人都会有所帮助!让我们一起看看!

  许多Django应用程序需要执行异步任务,以免延迟HTTP请求的执行。我们还可以选择许多方法来完成异步任务。使用克莱里是一个更好的选择,因为克莱里

  有了大量的社区支持,它可以完美扩展,与Django结合使用也很好。芹菜不仅可以在Django中使用,而且可以在其他地方使用。因此,一旦您学会使用克莱利,我

  我们可以在其他项目中非常方便地使用它。

  1.克莱里版本

  这篇博客文章主要针对芹菜3.0.x。克莱里的早期版本可能有轻微的差异。

  2. Cerry介绍

  Clery的主要用途是执行异步任务。您可以选择扩展或定期执行功能。为什么需要执行异步任务?

  首先,假设用户正在启动请求并等待返回请求。在此请求背后的视图函数中,我们可能需要执行长期的过程任务。目前,我们可能

  它可能远大于用户公差的范围。当不需要立即执行此任务时,我们可以使用Clery在后台执行,而不会影响用户浏览Web。

  当涉及到,我们通常无法确定它花费的时间。

  第二个是定期执行常规任务。例如,您需要每小时检查天气预报,然后将数据存储到数据库中。我们可以编写此任务,然后让芹菜执行

  Web应用程序可以获取最新的天气预报信息。

  我们在这里谈论的任务是python函数(函数)。定期执行任务可以延迟执行此功能。我们可以使用Clery将功能延迟5分钟5分钟。

  任务1并传递参数(1、2、3)。或者我们也可以每天午夜运行该功能。

  我们偏向项目中的项目,这对于访问统一数据库和Django设置的任务很方便。

  准备好任务后,芹菜会将其放在队列队列中。队列存储任务列表。我们可以使用多个队列,但是为简单起见,我们在这里只使用一个。

  将任务任务放在队列中就像加入TODO列表一样。为了使任务运行,我们还需要在其他线程中运行艰苦的工作。工人观察实时行动的任务,然后一一运行。

  一些任务。您可以在不同的服务器上使用多个工人。同样,为简单起见,我们只使用一个工人。

  我们将在以后讨论队列,工人和另一个非常重要的过程。接下来,让我们这样做:

  3.安装克莱里

  我们可以使用PIP在vietualenv中安装:

  PIP安装django-clery

  4. Django设置

  我们暂时使用Django Runserver来启动Clery。和芹菜代理,我们使用Django数据库代理实现。现在我们只需要知道克莱里芹菜

  需要经纪人,您可以使用Django本身作为经纪人。(但是,当部署时,我们最好使用更稳定和高效的布拉克,例如Redis。)

  在steratings.py中:

  导入djcelery

  djcelery.setup_loader()

  broker_url ='django://'

  Em

  instasted_apps =((

  Em

  'djcelery',

  'kombu.transport.django',

  Em

  治愈

  第一个和第二个项目是必要的,第三个项目告诉芹菜将Django项目用作经纪人。

  添加到installed_apps中的djcelery是必要的。kombu.transport.django是基于Django的经纪人

  最后创建芹菜所需的数据表。如果您将South用作数据迁移工具,请运行:

  python manage.py迁移

  否则,运行:( Django 1.6或Django 1.7可以)

  python manage.py syncdb

  5.创建一个任务

  如前所述,任务是Pyhton功能。但是芹菜需要知道此功能是任务,因此我们可以使用装饰器:@task。

  在django应用程序目录中创建taske.py:

  从芹菜导入任务

  @任务 ()

  def add(x,y):

  返回x + y

  当settings.py运行中的djcelery.setup_loader()时,Clery将在APPS Directory中的App Directory中的所有task.py文件中查看Appled_apps中的App Directory中的所有task Files,查找标记为任务的函数,并且预防。

  将它们注册为Clery任务。

  标记函数作为任务不会阻碍其正常执行。您仍然可以像往常一样称呼它:z = add(1,2)。

  6.执行任务

  让我们从一个简单的示例开始。例如,我们希望在用户发送请求并立即返回响应后执行任务异步,以免阻止请求,用户可以平稳访问

  过程。然后,我们可以在Views.py的视图中使用.delay:

  从myapp.tasks导入添加

  Em

  add.delay(2,2)

  Em

  克莱里将添加任务以排队并立即返回。在看到工人一侧的任务后,它将根据设置执行并将其从队列中删除。工人将执行以下一代。

  代码:

  导入myapp.tasks.add

  myapp.tasks.add(2,2)

  7.关于导入

  应该注意的是,当IMPPRT任务时,它需要保持一致。因为执行djcelery.setup_loader()时,任务基于installed_apps中的应用程序名称。

  添加.tasks.function_name进行注册。如果由于不同的Python路径而使用不同的参考方法(例如,使用MyProject.myapp.tasks在tasks.py中导入的the。

  添加表单),Cerly不会知道这是同一任务,因此可能会导致奇怪的错误。

  8.测试

  A。开始工人

  如前所述,我们需要一个工人来执行任务。以下是如何在开发环境中启动工人的方法:

  首先启动终端,例如开发Django项目,激活Virtualenv,切换到Django Project目录。然后启动django构建的Web服务器:Python Manage.py Runserver。

  然后开始工人:

  python manage.py芹菜工人-loglevel =信息

  目前,工人将在终端运行并显示输出结果。

  b。开始任务

  打开新终端,激活Virtualenv,然后切换到Django项目目录:

  $ python manage.py shell

  从myapp.tasks导入添加

  add.delay(2,2)

  目前,您可以看到工人在工作窗口中执行任务:

  [2014-10-07 08:47:08,076:info/mainprocess]从经纪人获得任务:myapp.tasks.add [e080e047-b2a2a7-af74-af74-d7d98b02fc]

  [2014-10-07 08:47:08,299:info/mainprocess]任务myapp.tasks.add [e080e047-b2a2-43a2-43a7-af74-af74-d7d98b02fc]

  9.另一个例子

  让我们看一个更真实的示例,即views.py和tasks.py:

  #views.py

  来自myApp.tasks导入do_something_with_form_data

  def视图(请求):

  form = someform(request.post)

  如果form.is_valid():

  data = form.clenet_data

  #安排任务以稍后进行数据

  do_something_with_form_data.delay(data)(数据)

  返回render_to_response(...)

  #tasks.py

  @任务

  def do_something_with_form_data(数据):

  call_slow_web_service(data ['用户'],data ['text'],...)

  10.调试

  由于克莱里的操作需要启动多个组件,因此我们可能会错过一两个组件。因此,我们建议:

  使用最简单的设置

  使用Python调试和记录功能显示当前过程

  11.渴望模式

  如果在设置中的设置。py:

  Celery_always_eager = true

  然后芹菜以急切的模式运行,然后任务不需要添加延迟即可运行:

  #如果启用了急切的模式,则以下两行代码是相同的

  add.delay(2,2)

  添加(2,2)

  12.查看队列

  因为我们将Django用作经纪人,所以排在Django数据库中的队列。这意味着我们可以通过Django管理员查看队列:

  #admin.py

  来自django.contrib导入管理

  从kombu.transport.django导入模型为kombu_models

  Admin.Site.Register(Kombu_models.message)

  13.检查结果

  运行异步任务后,芹菜将异步对象返回结果。您可以保存它,然后检查任务是否成功运行并返回结果:

  #views.py

  结果= add.delay(2,2)

  Em

  如果结果。dready():

  打印“任务已运行”

  如果结果。Successful():

  打印“结果为:%s”%结果。

  别的:

  如果是isInstance(结果,例外):

  打印“任务失败,原因是提出例外”

  提高结果

  别的:

  打印“任务失败而没有提高例外”

  别的:

  打印“任务尚未运行”

  14.常规任务

  还有一种普通的牧师来执行常规任务。执行常规任务时,芹菜将通过芹菜过程完成。将维护芹菜。一段时间后,需要执行一定时间。

  走路时,芹菜症将其添加到队列中。与工作过程不同,芹菜只需要一个。

  启动CleryBeat:

  python manage.py Clery Beat

  有很多方法可以使芹菜执行常规任务。让我们先查看第一个,然后将常规任务存储在Django数据库中。即使在Django和Clery中运行的状态

  方便地修改常规任务。我们只需要在设置中设置一个即可打开此方法:

  #settings.py

  Celerybeat_scheduler ='djcelery.schedulers.databasescheduler'

  您应该使用Django自己运行的开发服务器的示例,并在Django的文档中写入有关Manage.py的文档:

  - 毫无用处

  默认情况下,开发服务器是多线程。使用-NothReading选项禁用开发服务器中的线程用户。

  换句话说,默认情况下,您使用https://www.shouxicto.com/article/manage.py.py runserver打开多个线程以服务于http请求,因此,尽管第一个请求仍在第二请求中,但第一个请求,第一个请求仍在第一个请求中。但是,已经打开了一个新线程以进行响应,它看起来像是“非阻止”工作模式。本质是多线程,而不是单个线程。我想禁用此行为。-NothReading参数:https://www.shouxicto.com/article/manage.py runserver -nothreading。

  坦率地说,在一群Python用户面前,这实际上是一件事,放弃了Python来求助于Python。

  永恒的非解决主题可能会导致粉丝的强烈反击。因此,我只能从我们项目的实际情况开始。就为什么我最终选择去而言。

  你为什么放弃python

  首先,我必须谈论为什么我们选择Python。在加入Enterprise Fast Disk团队之前,整个项目都包括较早的Jinshan Fast Disk。

  当时的建筑师洋葱告诉我什么样的选择,主要是因为Python很简单且发展迅速。对于大多数没有服务的学生 - 在团队中没有服务的学生,Python是真的

  这是一个不错的选择。

  Python的简单高效,我有深刻的了解。在那个时候,有几个程序员在私人云项目中,但是我们需要为许多大型企业提供定制开发的大型企业。多亏了Python,我们可以快速生存。等级,在公司迅速挂起之后,我们开始了Light Office项目,并且自然使用Python来构建原始版本。

  尽管Python非常强大,但我们在使用时也遇到了一些问题,主要来自以下方面:

  动态语言

  Python是一种动态的强型语言。但是,仍然可能存在INT +字符串之类的错误,因为对于变量,编写代码时,有时我们很容易忘记哪种类型的变量是。

  在Python中,可以允许同名的功能。后一个功能将涵盖先前的功能。一旦我们的系统是一个非常严重的错误,因此。

  上面提到的静态语言可以帮助我们检测到何时编译,而无需等到问题发生。尽管我们有一个完美的测试用例,总会有案例。如果我可以编译,那应该很好。

  表现

  实际上,这一直是许多人谈论python的地方,但是Python有适合它的东西。很难使用Python开发一些高性能模块,这也很难做到。

  Python的GIL会导致真正的多线程,每个人都可能会说我不会使用多个程序。

  使用无状态分布的多个过程非常方便。例如,处理HTTP请求。我们在NGINX后面安装了200多个Django服务器,以处理HTTP,但是许多过程自然会导致高度的整体机器负载。

  但是,即使我们使用多个Django流程来处理HTTP请求,Python仍然无法处理一些超大的请求。因此,我们使用开放性来实现高频http请求以实现实现。不同的代码。

  同步网络模型

  Django的网络正在阻止网络,也就是说,如果我们需要访问外部服务,在等待结果返回期间,Django无法处理任何其他逻辑(除了多线程除外)。如果访问外部服务需要很长时间,这意味着我们的整个服务几乎无法在几乎很长一段时间内提供。

  为了解决此问题,我们只能继续打开更多的Django流程。同时,我们需要确保所有服务都可以快速处理响应,但考虑到这实际上是一件非常不可靠的事情。

  异步网络模型

  Tornado的网络模型是异步的,这意味着它不会出现,因为Django无法响应该服务,因为无法使用外部服务。它很小而简单。我曾深入撰写几篇文章,以分析龙卷风。

  尽管龙卷风是异步的,但Python的MySQL库不支持异步,这意味着,如果我们访问龙卷风中的数据库,我们仍然可能会面临由数据库问题引起的整个服务。

  实际上,异步模型的最大问题是切割代码逻辑。因为事件是触发的,所以我们都通过回调进行相关处理,因此代码中通常有一件事,传递回调,然后从回调中回调,结果是整个代码逻辑非常混乱。

  Python没有本地的Coroutine支持。尽管您可以通过Gevent和Greenlet的补丁方法支持公司,但毕竟,Python源代码已更改。

  此外,Python的产量也可以执行简单的Coroutine模拟,但毕竟,它不能跨堆栈,并且非常有限。我不知道3.X版本是否有所改进。

  开发操作和维护部署

  当我第一次使用Python开发项目时,我没有成功安装项目所需的袋子。MySQL图书馆已成功安装了很长时间。老板,一位同事将他的整个Python目录包装给我,以便我可以正常运行该项目。换句话说,现在对Docker感到非常高兴。

  部署Python服务时,我们需要在服务器上安装一堆袋子。通过木偶和盐解决部署问题非常麻烦。但是,就静态编译而言,仅使用一个二进制文件很方便。

  代码失控

  Python非常灵活和简单。编写c只能完成数十行。没有它,可以解决Python的行代码。但是它太简单了,但是许多学生无法深入考虑该代码

  考试,仔细考虑整个架构。需求出现,pop -up,键盘敲击快速实施,结果是代码变得越来越混乱,最终导致整个项目代码无法控制。

  尽管这也有我们自己的原因,例如,没有良好的代码审核机制,但没有良好的项目规范,但是个人认为,如果程序员没有接受良好的编码培训,那么很容易与Python一起编写不良代码,因为它太多了,因为它太多了,因为它太多了,因为它太多了,因为它太多了。

  当然,我并不是要使用Python开发大型项目。Douban和Dropbox都是一个很好的例子,但是在我们的项目中,我们的Python代码失控了。

  上面提到的所有都是我们在实际项目中python遇到的问题。尽管最终都解决了它们,但它让我感到,随着项目的复杂性的增加,交通绩效的压力增加,python也被比较了一个不错的选择。

  为什么选择去

  在谈论Python之后,让我们谈谈为什么我们选择GO。实际上,除了Python之外,我们还有其他选择,Java,PHP,Lua(OpenReast),但最后我们选择了Go。

  尽管Java和PHP是最好的编程语言(每个人都很战斗),但我更喜欢一种简单的语言。开名置信,尽管性能很强大,但LUA仍在移动

  语言状态还将遇到前面提到的一些问题。最后,Qianjinshan Xu Fangwei的使用情况,即也使用的正面-Dial架构师的前部,因此我们自然选择了GO。

  Go不是完美的,值得我们呕吐的地方。

  错误,好吧,如果您有一个语言清洁同学,您可能真的无法忍受GO的语法,尤其是商定的最后一个返回值是错误。此代码通常填充此代码:

  如果_,err:= w.write(data1);呃!= nil {

  returun err

  }

  如果_,err:= w.write(data2);呃!= nil {

  returun err

  }

  难怪有需求的茎。当Java的程序员编写配置时,GO程序员已经编写了大多数代码,但是当Java完成编写的程序员编写时,GO程序员仍在编写ERR!= nil!本质

  在这方面,错误价值已建议使用一个好的解决方案。

  软件包管理,GO的软件包管理太弱了,只有一个

  得到,也就是说,如果您不小心更新外部库,则可能无法编译现有代码。尽管已经有许多开源解决方案,例如Godep和GB,现在只出现了,但是Bai

  这不是正式的。似乎Google还通过供应商机制管理第三张库。我希望GO 1.5或后续版本能够解决此问题。

  GC,Java的GC已经开发了20年,GO是如此的时间,GC铁并不完美。因此,我们仍然无法按照我们的意愿编写代码,否则GC可能会根据大量要求将其粘在整个服务中。因此,有时需要使用对象池和内存池。尽管代码很丑陋,但性能仍在继续。

  对于通用,尽管GO具有直角,但缺乏通用类型将使我们在获得功能时能够编写大量重复代码,例如INT32和INT64类型

  您必须分别编写两组代码。

  生成物的支持,但这仍然需要基于GO的AST库手动编写相关解析器,这也非常困难。尽管有许多开源生成实现,但

  但是毕竟,这不是正式的。

  当然,有很多地方值得谈论,这不会一个人列出,但Go仍然具有其优势。

  静态语言,强类型。静态汇编可以帮助我们检查大量错误。强大的GO类型甚至可以扭曲到不支持隐藏类型的类型转换。尽管编写代码觉得很尴尬,但它会减少犯错误的可能性。

  GOFMT,这应该是我知道提供统一格式的代码工具的第一种官方语言。GOFMT,GOFMT,每个人的代码很长,最后都没有括号,或者是新的鸡蛋痛的代码样式。代码样式是相同的,很容易查看GO代码。

  出生于并行支持中,因为Goroutine和Channel使用使用来编写分布式应用程序,并且编写并发程序非常容易。代码逻辑分开是由疼痛而没有鸡蛋疼痛引起的,并且代码逻辑是顺序的。

  性能,GO的性能可能无法跟上C,C ++和开放式,但确实很强大。在我们的项目中,单个GO流程现在由一台机器部署,这完全可以做事。进行前200个Python过程,CPU和MEMS占据较低。

  直接将二进制汇总到服务器上的操作和维护部署,安装一堆需要安装的环境非常简单,而不是Python。当然,如果有CGO,我们还需要投掷相应的动态库。

  发展效率,尽管GO是一种静态语言,但我个人认为开发效率确实很高,直觉与Python相当。就我个人而言,最好的例子是我可以快速使用GO打开它

  有许多开源组件,例如ledisdb,go-mysql等,这些初始版本在短时间内完成。对于我们的项目,我们也可以使用一个

  第一个版本在一个月内进行了重组和发布。

  通常,它通过动态和静态,隐藏的容器和Web应用程序部署习惯长期形成。Runserver,像Django一样,确实无法执行生产环境,这是不稳定的,这既不是异步计划Uwsgi的Gunicon或多个过程。

  1. Django

  Python中最全能的Web开发框架,完整的功能,维护和开发速度首先是级别,许多人对Django框架做出了缓慢的响应,它主要是Djangoomor和数据库之间的相互作用较慢,因此是否使用Django Frameworkit,需要取决于项目对数据库交互和各种优化的要求。对于Django的同步特征,芹菜可以解决小吞吐量的问题,这不是致命的问题。

  2.龙卷风

  异步和强大的性能,但是与Django框架相比,它相对原始,许多事情需要由自己处理。随着项目逐渐扩展,框架可以提供的功能将变得越来越小。更多的事情需要团队参加团队。要自己实现这一目标,并且大型项目通常需要绩效保证,目前这是最好的选择。

  3.烧瓶

  可以说微型框架是Python代码的最佳项目之一。它的灵活性也是一把双刃剑。它可以使用烧瓶框架,也就是说,它可以制成pinterest。但是它也可以将其制成大型烧瓶,此外,它可以自由选择自己的数据库交互式组件,并在添加异步功能(例如Clery+)之后雷迪斯(Redis),烧瓶的性能比龙卷风可比。也许烧瓶的灵活性可能是可能需要更多的团队。

  4.扭曲

  前面提到的三个网络框架是在应用程序层HTTP周围进行的,而扭曲是不同的。这是一个由Python语言驱动的网络框架。对于应用服务器性能的应用是一个很好的选择。

  它支持许多协议,包括传输层的UDP,TCP,TLS和应用层的HTTP,FTP。对于这些协议,Twisted提供了客户和服务器开发工具。

  这是一个高性能的编程框架。在不同的操作系统上,扭曲使用不同的基础技术来实现高性能的交流。在开发方法方面,使用异步编程模型的扭曲指南程序员。它提供了丰富的延期,螺纹核能的特性,以支持异步编程。

  克莱里(Clery)是基于Python开发的简单,灵活和可靠的分布式任务队列框架。它支持使用任务队列在分布式计算机/流程/线程上执行任务计划。典型的生产者消费者模型主要由三个部分组成:

  例如,系统在系统前批量介绍历史数据,发送文本消息,发送电子邮件和其他时间 - 耗费的任务

  1.安装兔子。在这里,我们将RabbitMQ作为经纪人。安装完成后

  Ubuntu Linux安装

  CentOS Linux安装

  Apple Mac安装需要配置

  配置环境变量(Apple用户)

  启动RabbitMQ服务器

  2.安装克莱里

  3.芹菜在Django项目中使用,Django项目目录结构(简化)如下

  4.创建OA/CLERY.PY主文件

  5.在OA/__ init__.py文件中添加以下内容,以确保Django启动时可以加载此应用程序

  6.每个应用程序都会创建一个任务。Py文件,此处使用/tasks.py。

  7. Views.py引用以使用此任务异步处理

  8.启动克莱里

  9.这样,在调用帖子方法时,可以异步地处理内部的添加

  定时任务的使用方案非常普遍。例如,我需要定期向老板发送报告?

  1. oa/clery.py文件添加以下配置以支持计时任务crontab

  3.首发克莱里·比特(Start Clery Beat),芹菜已经开始了一个节拍过程,该过程一直在不断判断是否有执行的任务

  结论:以上是首席CTO介绍的所有内容,说明了为什么Django不同步。我希望这对每个人都会有所帮助。如果您想了解有关此信息的更多信息,请记住收集并关注此网站。