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

Django如何使并发(Django可以支持多少并发))

时间:2023-03-08 01:34:54 网络应用技术

  今天,我将与您分享Django的知识如何并发。其中,Django可以同时支持并发。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!

  本文目录清单:

  1.如何使用django中的django-clery完成异步任务2. Django如何进行转发或映射?3。DJANGO并发是多线程或Epoll 4. Python高的并发网络框架5.在并发编程下6.如何在Django模型中管理和同时管理管理人员需要许多DJANGO应用程序来执行异步任务,以免延迟执行执行HTTP请求。Weyou还可以选择许多方法来完成异步任务。使用克莱里是一个更好的选择,因为克莱里

  有了大量的社区支持,它可以完美扩展,与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'

  将UWSGI用作Django网站服务器,并将NGINX用作转发服务器和静态资源服务器。

  Django具有自身的效率,并且不使用Epoll/Kqueue。

  很难说有多少人在线。

  测试后,对于我的计算机,最初的Django项目的能力约为294。

  相反,龙卷风是高性能的服务器。其文档的网络示例约为1324。

  一个仅包含“ Hello World!”的静态文件在nginx上,约为2942

  Python的网络框架

  Django(大型,全面,模板,随附)

  烧瓶(由Pocoo生产,这是一家精品店,带有Jinja2模板,可以更换))))

  web.py(我还没有使用过,作者自杀了,主人是盲目的)

  瓶子(只有一个文件框架,您需要自己构建整个开发系统)

  Uliweb(由中文开发,也很好)

  龙卷风(异步框架,适合长时间连接,例如在线聊天)

  尽管据说Python框架充满了鲜花,但仍然有最大的框架,它是Django.Django的位置,主要称为:

  ①完美的文档,Django的成功,我认为很大一部分原因是归因于Django几乎完美的官方文档(包括Django Book)。

  ②一组完整的解决方案,例如Rails,提供了一套完整的解决方案(包括全堆栈框架 +电池),基本上需要的内容(例如:缓存,会话,feed,feed,orm,auth),以及所有djangocrecocretect由开发网站开发的Django本人基本上为您做了。因此,不必说开发效率很容易找到。它不在Django的源代码中。

  ③功能强大的URL路由配置,Django允许您设计一个非常优雅的URL。在Django中,您基本上可以对丑陋的获取参数说。

  ④自我服务背景,管理界面是对Django更具吸引力的Django。它使您在不编写代码行的情况下具有完整的背景管理界面。

  该过程是计算机中最小的资源分配单位。一个过程中可以有多个线程,并且在同一过程中的线程共享资源;

  过程和过程彼此隔离。

  Python可以通过多进程使用多进程的多核优势,并且密集操作适用于多过程。

  关于在基于Python的多探索模块中操作的过程:

  叉,[复制“几乎所有资源” [支持文件对象/线程锁和其他传记] [UNIX] [在任何位置开始] [快速]

  Spawn,[运行参数被动资源] [不支持文件对象/线程锁和其他传记] [UNIX,WIN] [主代码块启动] [慢速]

  forkserver,[运行参数传输基本资源] [不支持文件对象/线程锁和其他传记] [UNIX的一部分] [主代码块启动]

  官方文件:

  示例1

  示例2

  案件:

  过程的常见方法:

  该过程是资源分配的最小单元。在每个过程中,它都维护其独立数据,并且不共享。

  如果您想分享它们,则可以使用一些特殊的事情来实现。

  共享内存

  数据可以存储在共享内存映射用户或数组中。对于Exmple,以下代码[数据可以存储在带有值或数组的共享内存映射中。例如,以下代码]

  服务器过程

  Manager Object by Manager()控制服务器Procestss Python对象和所有Processssssssssssssssssesssesssesssesssesssesssesssesssesssesssesssesssesssesssesssestsestsestsestsest

  [Manager()返回的Manager对象控制服务器进程,该进程保存了Python对象,并允许其他进程使用代理来操作这些对象。

  多处理支持过程之间的两种类型的通信渠道

  [支持两个过程之间的通信渠道]

  队列

  队列类是queue.queue的近乎克隆。对于Exmple

  管道

  管道()函数返回一对由管道白色连接的连接对象是双面的。对于Exmple:

  该函数返回通过管道连接的一对连接的对象,该对象默认为dual -time(两个-way)。例如:

  以上是Python提供的过程之间的数据共享和交换的机制。它可以用作理解。它很少用于项目开发。在后来的项目中,第三方通常使用它来共享资源。例如:MySQL,Redis,Rediswait。

  如果使用多个进程进行某些操作,以防止操作,则可以通过过程锁定避免使用。

  显然,操作时多个过程将遇到问题。目前,您需要锁定:

  注意:如果要在过程池中使用过程锁定,则必须根据管理器中的锁定和RLOCK来实现。

  暂时的理解。

  计算机提供:线程和过程用于实现并发编程(真实存在)。

  Coroutine是程序员通过代码的事情(非现实存在)。

  理事会也可以称为MICR -THEAD,这是用户状态中的上下文切换技术。

  简而言之,实际上,它是实现编码块通过线程(来回跳跃)相互切换。

  例如:

  以上代码是正常的函数定义和执行。这两个函数中的代码是根据过程执行的,输出将输出:1、2、3和4。

  但是,如果可以实现介入的Coroutine技术,则该功能可以看到代码切换执行,最终输入:1、3、2和4。

  有很多方法可以在Python中实施公司,例如:

  尽管以上两个都已实现,但这种编写代码的方式毫无意义。

  此背部 - 和 - 孔执行可能会使程序的执行速度较慢(与串行相比)。

  Coroutine如何更有意义?

  通过上述内容发现,在处理IO请求时,Coroutine可以通过线程实现并发操作。

  现在,许多Python框架都在支持企业,例如:Fastapi,Tornado,Sanic,Django 3,AioHTTP等,并且已经开发了越来越多的企业(并不是很多)。

  1.我们在查询上使用select_for_update来告诉数据库锁定对象,直到交易完成为止。

  2.在数据库中锁定一条线需要数据库事务 - 我们使用Django的Decorator Transaction.Atomic来定义交易。

  3.我们使用类方法代替实例方法 - 我们告诉数据库锁定,然后将锁的对象返回给我们。然后,它是从数据库中获得的对象。这个对象不能保证我们不会被锁定。

  4.帐户中的所有操作均在数据库交易中执行。

  Django可以支持多少并发性的引入以及Django可以支持多少。我想知道您是否从中找到了所需的信息?如果您想进一步了解此信息,请记住要收集对该网站的关注。