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

如何在Django中使用线程池(2023年的最新答案)

时间:2023-03-05 22:36:54 网络应用技术

  简介:今天,首席CTO注释要与您分享如何使用Django如何使用线程池。如果您能解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!

  克莱里(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),芹菜已经开始了一个节拍过程,该过程一直在不断判断是否有执行的任务

  当Django使用多线程线程时,由于UWSGI不会打开多线程默认值,因此我们需要手动打开UWSGI的多线程。

  休闲少,直接配置。

  在UWSGI的标准文件uwsgi.ini中添加以下线程字段

  这样,可以打开多线程。

  Django部署了爬网服务。客户端发送请求后,Django立即打开线程以执行时间 - 令人震惊的爬网。Django将返回客户“请等待”,而无需等待爬虫的结果。查询或Websocket的结果返回了客户爬网任务。

  可以使用Django运行RunServer运行项目,但是当使用NGINX+ UWSGI运行项目时,Reptile HTTP的HTTP请求将不会返回结果;当使用UWSGI分别拉动项目时,爬网的HTTP返回结果很慢。

  最后,发现UWSGI不支持多线程默认值。需要打开多线程(如上所述)以解决问题。

  老实说,直到到目前为止,我都不欣赏django。这不是我的认知中的微妙设计。这只是功能所积累的“成熟解决方案”。但是,一切的兴起都是时代的选择。您不喜欢它,但需要它。希望有一天,Python可以拥有越来越丰富的成熟解决方案,并且不再因性能和维护而受到批评。(Fit End)

  将其本质带到滴度上,Django的优势很方便。我们的源代码阅读的目的是探索其便利性的本质。阅读源代码的计划对每个地方都不好,而是解释功能的功能。

  django-admin startproject helloworld可以生成django项目。命令行是EXE格式。

  manage.py将参数交给了命令行。

  execute_from_command_line()通过命令行参数创建管理类。然后运行他的execute()。

  如果设置了重新加载,请在启动之前检查_errors。

  check_errs()是一个关闭,因此在上一篇文章的末尾是(django.setup)()。

  查看最后一个句子设置.installed_apps.grab从设置

  请注意,此设置不是我们项目中的设置。

  这是设置类的懒负载包装包装,直到__getAttr __。然后从设置类的实例中获取值,然后说将其分配给您自己的__ -dict__(我会直接找到它下次我自己,因为__getAttr __优先级)

  为了促进调试,我们直接编写一个run.py。

  在项目下创建一个run.py,以模拟运行服务器命令

  调试抓取设置_MODULE

  回到setup()中的最后一句话

  开始观看apps.populate()

  首先查看本段

  这些应用最终被封装在appconfig中。

  随后,调用了每个AppConfig的import_models()和ready()方法。

  应用程序的加载部分通常是这样的

  为了促进调试,我们重写了最后一句话

  RES的类型是命令django.contrib.staticfiles.management.commands.runserver.com和object at 0x00000101ED5163A0

  重点是第二个句子,让我们跳到run_from_argv()方法,这是几个处理参数。

  用Pycharm指向手柄将进入基类,该基类无法获得正确的方向。实际上,子类已重写此方法。

  这里有两种情况。如果加载重新加载,它将直接执行inner_run(),并且项目首先从其他逻辑开始。

  当Django项目启动时,它实际上将启动两次。如果我们在项目入口(Manage.py)中设置一个贴心,您会发现它将打印两次。

  在第一个启动开始时,django_autoreload_env却没有,无法输入启动逻辑。将输入crandt_with_reloader()。

  在这里,您将将django_autoreload_env放置为true,然后重新启动。

  第二次,您可以输入启动逻辑。

  在此创建一个Django主线程以传递innit_run()。

  随后,此线程创建了一个旋转式,通过reloader.run(django_main_thread)询问监护过程。

  让我们看一下django innion_run()的主线程。

  当我们看到WSGI时,Django的启动逻辑已经结束。下一个作业已移交给WSGI服务器

  这相当于我们之前在Fastapi中所说的话,然后将Fastapi的应用程序交给ASGI服务器(ASGI也是Django提出的,这两个基本上是同源的)

  那么WSGI来自哪里?让我们回头回去

  此设置是一个对象,它已从以前的操作中从settings.py配置文件中获取了自己的属性。因此,我们只需要转到settings.py配置文件即可找到。

  让我们找到此get_wsgi_application()。

  它将再次调用setup(),返回WSGIHANDLER类的实例很重要。

  这是WSGIAPP本身。

  load_middleware()是WSGIAPP构建中间件堆栈的唯一方法。

  如果您之前阅读了FastAPI源代码,则应该对中间件堆栈不陌生。

  应用程序入口→中间件堆栈→路由→路由节点→端点

  因此,WSGIAPP已完成此操作,并将服务器传递到应用程序入口的请求中,并且可以通过中间件与该路由分配。

  系统中经常有异步操作。每次触发异步操作时,都会启动一个新线程处理相关的逻辑,并且逻辑集中在I/O密集型类型中;经常出现新的/被摧毁的线程会消耗大量资源;因此,请考虑使用线程使用线程池替换现有逻辑。

  查询信息后,Python拥有可以直接实现线程池功能的ThreadPoolExecutor(明天)。它的使用方式

  请参阅ThreadPoolExecutor

  ThreadPoolExecutor建立的线程池将首先启动多个线程,并让这些线程处于睡眠状态。当提交到线程池的任务时,它将唤醒线程池中的某个睡眠线程,以使其处理此任务。处理此任务后,该线程正在睡觉。RODUCE建立了被破坏的线程池消耗量

  该项目中的实现如下(定义的装饰器)

  总体原则是:应尽可能将CPU密集型任务配置为小,并尝试与CPU的数量相似;IO强度的任务应尽可能地配置为线程,因为IO操作不占用CPU,请勿让CPU空闲,不要让其空闲。应该增加线程的数量。

  结论:以上是首席CTO的相关内容的摘要,内容涉及Django如何使用Django的相关内容。希望它对您有所帮助!如果您解决了问题,请与更多关心此问题的朋友分享?