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

python线程占用多少记忆

时间:2023-03-07 15:57:09 网络应用技术

  简介:许多朋友询问了Python线程的记忆。本文的首席CTO注释将为您提供一个详细的答案,以供所有人参考。我希望这对每个人都会有所帮助!让我们一起看看!

  本文目录清单:

  1. Python的多线程2. Python多进程内存职使用USETHE流程概念:以整体形式暴露于操作系统管理,其中包含各种资源的调用。各种资源管理的收集可以称为流程。

  线程的概念:是操作系统执行计算计划的最小单元。本质上,它是指令的集合。

  过程和线程之间的区别:

  1.内存空间的线程共享,该过程具有独立的内存空间。

  2.线程启动快速,过程启动速度很慢。注意:两者的运行速度无法比较。

  3.线程是执行的指令集,该过程是资源的收集

  4.两个子过程之间的数据未共享并完全独立。在同一过程中,从线程中显示相同的数据。

  5.创建新线程非常简单。要创建一个新的过程,需要克隆父亲的过程。

  6.一个线程可以在同一过程中操作其他线程,但是该过程只能操作子进程

  7.可以直接传达同一过程的线程。如果两个过程想通信,则必须通过中间代理实施。

  8.线程的修改可能会影响其他线程的行为。但是,父过程的修改不会影响子过程。

  第一个程序是创建带有循环的线程,但是该程序中有51个线程。我们创建了50个线程,但是程序本身是主线程的一个线程。这些51个线程是平行的。注意:在此程序中,主线程启动子线程。

  与以前的程序相比,该程序还有一个更多的计算时间,但是当我们观察结果时,我们会发现该程序的执行时间仅为0.007秒。这是因为最后一个打印功能是在子线程中并行的,因此可以想象,当执行子线程时,已执行打印功能。通常,这次仅执行一个线程,这是主线程的时间。

  接下来,该程序吸收了上述程序的缺点,创建了一个列表,存储了所有线程实例,然后使用一个用于循环来调用线程实例。所有sub -threads都可以下降。注意实验的结果:这两个线程的结果在两秒钟内更多

  请注意观察实验结果,没有执行打印任务,并且程序执行时间非常短。

  这是因为在启动子螺纹之前,将子线程设置为监护线。

  只要执行主线程,无论是否执行子线程,

  主线出口,监护人的线程都被迫退出。皇帝死了,仆人也随后葬礼

  应用程序场景:插座服务器

  注意:GIL只是为了降低程序开发的复杂性。相同的。

  以下程序是典型的生产者消费者模型。

  生产者消费者模型是开发体系结构中使用的经典模型

  操作和维护中的群集是生产者消费者模型。生活中的许多人是

  那么,多线程用途有什么用?

  Python中的多线程本质上是切换到上下文,可以说这是一个假的多线程。我们知道,IO操作不占据CPU并计算CPU,然后是Python的多线程多线程是适用于IO操作密集任务,例如插座服务器,然后是CPU密集型任务,Python Do?Python可以使用计算机的多核:启动八个进程,每个过程都有一个线程。可用于解决多方面问题。

  当我们有一个长长的任务队列(mission_list)和与阈值相对应的过程输入时,我们通常使用以下方法来处理:

  但是,如果此任务列表很长,并且处理功能很复杂(占用CPU),则通常需要长时间处理单个核心。目前,多进程可以大大提高我们程序的运行速度。相关内容可以大大改进。可以大大改进相关内容。请从基于Processes-Python 3.10.4的多处理中学习--- Python 3.10.4文档。

  在上述情况下,建议您使用最简单的进程池+地图方法进行处理。标准写作,大块必须从官方声明中学习,最好要变得更大:

  但是!InterectionSigntersectionIntertements如果我们的任务列表非常长,这将导致多过程在该过程破裂之前运行,并且该任务无法完成。目前,我们有几种优化方法:

  有三种开始过程的方法。您可以参考官方文件:

  [图片上传失败...(Image-48CD3C-165051153989)]]]

  在Linux环境中,使用Forkserver可以节省大量的内存空间,因为该过程启动了服务,该服务不会复制主过程的数据。

  使用IMAP将大大节省空间,它返回迭代器,即结果列表:

  但是请注意,在上面的写作中,您编写的结果的迭代必须写下来。或以另一种方式使用:

  还有最后一个。当您的任务列表太大时,它会导致您在生成任务列表时破坏内存。此时,您可以使用屈服字段将其封装为迭代器并将其传递到过程池中:

  这样,我们封装了Mission_List,这是一个迭代对象,在获取数据时将数据拉到内存中

  我将后两个方法组合在一起。原始的256G内存还不够,但是修改后的内存仅少于10克。

  2G.Python在1990年代初期由荷兰和计算机科学研究协会的Gendolusham设计了2G.Python的班级职业。

  在Python中使用线程模块可以运行程序的不同部分并简化设计。如果您已经启动Python并想使用线程来提高程序的速度,我希望本教程对您有帮助。

  线程和过程

  什么是一个过程

  该过程是系统地执行资源分配和调度的独立单元流程。这是一个有关数据集上运行活动的独立功能的过程。该过程是执行资源分配和调度的系统的独立单元。east过程具有其独立的内存空间,并且通过Inter -Process通信进行了不同的过程。由于该过程相对较重,并且占据了独立的内存,因此Switching Switching Switch intering在头顶上开发(堆栈,注册,虚拟内存,文件句柄等)上下文过程之间相对较大,但相对稳定且安全。

  什么是线程

  CPU调度和分发的基本单元线程是该过程的实体,即CPU调度和分发的基本单元。它是一个基本单元,可以比该过程更独立地运行。它是操作中的重要资源(例如程序计数器,一组寄存器和堆栈),但它可以共享由同一流程所拥有的所有资源到相同的过程。线程之间的通信主要通过共享内存。上下文切换很快,资源开销很小,但是与过程相比,数据容易丢失数据。

  过程与线程之间的关系

  线程和过程之间的区别:

  过程

  在现实生活中,场景中有很多事情同时进行。例如,当您开车时,您可以一起驾驶汽车和脚。

  注意:

  概念概念

  什么是多个任务?简而言之,操作系统可以同时运行多个任务。例如,当您使用浏览器在互联网上浏览Internet时,在收听MP3时,您正在使用Word来快点。这是多任务处理。至少有3个任务正在同一时间运行。在后台同时同时安静地运行了许多任务,但是桌面上没有显示。

  目前,多核CPU非常受欢迎,但是即使在过去的单核CPU中,也可以执行多个任务。由于CPU执行代码是按顺序执行的。

  答案是,操作系统需要轮流以交替执行每个任务。任务1执行0.01秒,切换到任务2,任务2执行0.01秒,然后切换到任务3,然后执行0.01秒。这是反复执行的。在表面上,每个任务都交替执行,但是由于CPU的执行速度太快,我们认为所有任务均同时执行。

  实际并行执行多任务只能在多核CPU上实现。但是,由于任务的数量远远超过CPU的核心数量,因此操作系统将自动将许多任务派遣到每个核心以进行执行。实际上,CPU执行速度太快了!动荡的安排。

  平行和并发

  并行性

  并行:同时指的是两个或多个事件(或线程),同时,在实际意义上同时在不同的CPU资源上同时(Multi -core),不同的事件或线程,并同时执行。

  特征

  并发

  在几个渠道程序(或线程)之间以多种原因指出物理CPU(也是多个物理CPU),并且该公司被迫行使多用户共享以提高物理资源以提高效率。

  特征

  Multiprocess.prcess模块

  该过程模块是创建过程的模块。使用此模块,可以完成该过程的创建。

  

  该类别获得的对象指示子过程中的任务(未启动)。

  注意:1。必须使用关键字方法来指定参数;2. ARGS指定传递给目标函数的位置参数。这是一种正式的祖先形式,必须具有逗号。

  参数简介:

  组:未使用参数,默认值无。

  目标:表示子过程要执行的任务。

  args:指示呼叫的位置参数。

  Kwargs:指示呼叫对象的字典。例如kwargs = {'name':jack,'age':18}。

  名称:子过程名称。

  代码:

  除了上述打开该过程的方法外,还可以通过继承该过程来启动该过程:

  通过上述研究,我们尽了最大的努力来实现该程序的异步,因此可以在多个过程中处理多个任务。他们之间的操作没有订单,一旦打开,它就不会由我们控制。尽管并发编程使我们能够完全使用IO资源,但它也带来了我们的新问题。

  当多个进程使用相同的数据资源时,它将导致数据安全或顺序混淆。我们可以考虑锁定。我们以模拟票证抓取作为示例,以查看数据安全的重要性。

  当锁定可以确保多个进程修改相同的数据时,只能同时修改一个任务,即串行修改。锁定锁定,但保证数据的安全性。

  因此,我们最好找到一个解决方案以考虑到这两者:1。高效率(多个过程共享一个内存数据)2。帮助我们解决锁定问题。

  由MutiProcessing模块提供的基于消息的IPC通信机制:队列和管道。队列和管道是根据(管道+锁)实现的,以将数据存储在内存中,这可以使我们摆脱复杂的锁定问题。我们应该尝试避免使用共享数据,使用消息传输和排队尽可能多,排队队列,避免处理复杂的同步和锁定问题,以及当过程数量增加时,通常可以获得更好的展览性(随后的扩展。这个内容)。

  线

  Python的线程模块

  Python为多线程编程提供了几个模块,包括线程,线程和队列。线程和线程模块允许程序员创建和管理线程。线程模块提供基本的线程和锁定支持,并且线程提供更高的级别,更具功能性的线程管理功能。队列模块允许用户创建一个队列数据结构,该结构可用于在多个线程之间共享数据。

  Python创建和执行线程

  创建线程代码

  1.创建方法1:

  2.创建方法2:

  流程和线程是实现多个任务的一种方法,例如:多个QQ(进程)可以同时在同一台计算机上运行,并且一个QQ可以打开多个聊天窗口(线程)。回库共享:该过程不能为共享,使用线程共享过程的地址空间和其他资源。同时,该线程具有自己的堆栈和堆栈指针。因此,过程中的所有线程共享全局变量,但是通过多线程进行的全局变量的变化可能会导致变量混淆。

  代码演示:

  结果是:

  需要清楚的第一件事是,吉尔不是python的特征。这是实现Python Parser(CPYTHON)时引入的概念。就像C ++是一组语言(语法)标准,但可以通过不同的编译器将其编译到可执行的代码中。可以通过不同的Python执行相同的代码执行环境,例如cpython,pypy,psyco(jpython中没有吉尔(Jpython)的吉尔(Jpython)。

  那么Cpython实施中的GIL是什么?吉尔的全名全球口译员锁以避免误导,让我们看一下官方解释:

  主要含义是:

  因此,解释器实际上受到全局解释器锁的保护,它可以确保任何时候只有一个python线程。在多线程环境中,python虚拟机被执行如下:

  由于GIL的存在,Python的多线程不能称为严格的多线程。由于在执行多个线程期间,每个线程都需要首先获得GIL,因此可以保证只有一个线程同时运行。

  由于GIL的存在,即使它是多线程,实际上,同一时间也只有一个线程。由于此多线程线程的工作效率与单个线程不同,为什么您仍然需要使用多线程?

  由于先前的计算机基本上是单个核心CPU,因此多线程和单线线程几乎看不到差异。但是,由于计算机的快速开发,计算机几乎是所有多核CPU,至少是两个内核。目前,差异是差异。目前,差异是差异。它出现了:通过以前的情况,我们已经知道,即使在多核CPU中,多线程线程也只有一个线程。这不仅不能使用多核CPU的优势,而且由于在多个CPUSE上的多个CPU上都在多个CPU上交替使用多个CPU,因此在打开不同的CPU时会导致浪费资源。锁定一个过程。当执行多个线程时,GIL锁将在内部加扰,这将导致CPU在未抓取某个线程时等待,然后不能合理使用多核。CPU资源。

  但是,当使用多线程捕获网页的内容时,遇到IO阻塞时,该线程将临时释放GIL锁。目前,其他线程将使用此差距时间来执行自己的代码。因此,grassing性能很好,因此我们仍然需要使用多线程。

  吉尔对多载计划的影响

  该程序的性能受到计算的致密类型(CPU)和I/O -dense程序限制的过程限制的影响。那么,计算密集和i/o浓度程序是什么?

  计算致密类型:大量数值计算,例如数亿个数字计算,计算外围率,视频的高定义解码等等。主要时间在任务切换时期花费。目前,CPU执行任务相对较低。

  IO密集型类型:涉及网络请求(time.sleep())和磁盘IO任务是IO密集型任务。此类任务的特征是CPU消耗量,大多数任务都在等待IO操作(因为IO的速度远低于CPU和内存的速度)。对于IO强度,任务越多,越高,越高CPU效率,但也有一个极限。

  当然,为了防止GIL影响我们的程序,我们也可以使用线程锁。

  Lockrlock

  公共资源共享锁定机制:锁,RLOCK,SEMPHORE,状况等,只需为每个人共享锁和RLOCK。

  锁

  特征是执行速度很慢,但是保证了数据的安全性

  Rlock

  不当使用锁定代码将产生死锁。

  什么是死锁

  死锁:当线A持有独家锁A并尝试获得独家锁B时,线程B持有独家锁B并试图获得独家锁A.与另一方所需的锁以及发生的阻塞现象,我们称其为致命。也就是说,死锁指的是由于竞争资源而导致的多个过程造成的僵局。如果没有外力,这些过程将无法向前发展。

  因此,请注意如何在系统设计和过程计划方面预防这四个必要条件,即如何确定资源的合理分配算法以避免永久占据系统资源。

  僵局代码

  python线程交流

  如果每个线程都完成,则不需要通信,并且此代码非常简单。但这通常是不可能的。至少线程应与主线程通信,否则无法检索计算结果的内容。实际情况非常复杂,需要交换多个线程以获得正确的执行结果。

  Python中的队列是提供线路通信机制的消息队列。Python3被命名为队列,队列模块下提供了几个阻止队列。这些队列主要用于实现线程通信。

  在队列模块下,主要提供三个类别,代表三个队列。它们之间的主要区别是队列和队列的差异。

  简单的代码演示

  目前,代码将被阻止,因为队列中的内容已满。目前,您可以在第四个队列后面添加超时。put('苹果'),并且将其变为Queue.put('Apple',超时= 1),如果您等待1秒钟,铃铛仍然已满,并且会抛出例外并可以捕获异常。

  以同样的方式,如果队列为空,则默认情况下将被阻止。如果不阻止它,则可以使用queue.get_nowait()。

  掌握了队列阻止队列的特征后,您可以使用队列在以下程序中实现线程通信。

  以下证明了生产者和消费者。当然

  使用队列模块在线程之间进行通信并确保线程安全性。

  Coroutine

  理事会,也称为Micro -thread,纤维。英语名称Coroutine。

  Coroutine是在Python中实现多个任务的另一种方法,但是它占用比线程较小的执行单元(理解为必要的资源)。为什么它是执行单元,因为它具有CPU上下文。在合适的时间,我们可以将一个Coroutine切换到另一个Coroutine。

  大众理解:在一个线程中的一个函数中,您可以在任何地方保存一些当前功能的临时变量和其他信息,然后切换到另一个函数以执行。请注意,这不是通过调用功能和切换来完成的。开发人员本身切换原始功能的次数和何时。

  当实现多任务时,线程切换比从系统级别中保存和恢复CPU上下文要简单得多。操作系统具有CACH和其他数据,以供程序操作效率。操作系统还将帮助您完成这些数据的恢复操作。因此,线程的切换非常消耗。但是,Coroutine的切换仅仅是CPU的上下文,因此在第二秒内切换数百万个系统具有抗性。

  Greenlet和Gevent

  为了更好地使用Coroutine来完成多任务处理,除了使用本机产量完成模拟Coroutine的工作外,实际上,Greenlet模块和Python的Gevent模块也使Coroutine的实现更加多简单有效。

  尽管Greenlet实现了Coroutine,但它要求我们手工切换。这太麻烦了。Gevent是一个比Greenlet强大的模块,可以自动切换任务。

  原则是当绿色遇到IO(参考输入输出输入和输出,例如网络,文件操作等)操作(例如访问网络),自动切换到其他绿色,等待直到IO操作完成,然后在适当的时代开关继续执行。

  仿真时间 - 耗费操作:

  如果您还可以用时间耗费的操作替换它,则目前需要修补GEVENT中实现的模块。

  使用简单的第二手房屋信息的校正来使用校正!

  以下文章来自Python专栏,作者歌曲和歌曲

  文章链接:

  python线程

  在此过程中有许多优势。它提供了可以改善计算机CPU的利用率的多个编程。由于该过程是如此出色,为什么它是线程?实际上,如果仔细观察,您会发现该过程中仍然存在许多缺陷。

  它主要反映在几个方面:

  该过程一次只能完成一个任务。如果您想同时执行两个或多个任务,则必须启动多个进程才能完成多个任务。

  如果该过程在执行过程中被阻止,例如等待输入,则整个过程将被悬挂。即使该过程中的某些工作不取决于输入数据,也不会执行它。

  每个过程都有自己的独立空间,因此创建多过程,破坏比多线程更耗时,而且还占据了系统资源。

  该过程是资源分配的最小单元。该线程是CPU调度的最小单元。在每个过程中至少一个线程。

  线程和过程之间的区别

  可以总结为以下4分:

  1)地址空间:过程之间每个独立过程的每个过程都有其自己的独立内存空间,这意味着一个过程中的数据在另一个过程中不可见。但是共享了同一过程中线程之间的数据。

  2)通信:由于每个过程都有自己的独立内存空间,因此,过程中的过程需要IPC,并且可以为多个线程共享该过程中的数据,并且可以访问每个线程。

  3)时间表和切换:线程的切换比上下文开关快得多。

  4)在多线程操作系统中,该过程不是可执行的实体。它的主要功能是从操作系统申请存储空间,然后在内存空间中打开线程执行任务。它是真实的执行主体。一个进程可以包含多个线程,一个线程不能包含进程。由于该过程是系统分配的最小单元,因此该线程不能从操作系统中申请其自己的空间,但是可以将多个线程包含在一个线程中。

  相关建议:“ Python视频教程”

  线程的功能:

  在多线程操作系统中,通常在一个过程中包含多个线程中。每个线程是使用CPU的基本单位,该单元是其成本最低费用的实体。该线程具有以下属性。

  1)光实体

  线程中的实体基本上没有系统资源,但是有一些资源可以确保独立操作。

  线程的实体包括程序,数据和TCB。线程是一个动态概念,其动态特性由线程控制块TCB(线程控制块)描述。

  2)独立调度和分销的基本单位。

  在多线程OS中,线程是可以独立运行的基本单元,因此它们也是独立调度和分发的基本单元。由于线程为“光”,因此线程的切换非常快,费用很小(费用很小(在同一过程中)。

  3)共享过程资源。

  可以访问过程,计时器,计时器,信号机制等。由于线程共享内存和文件在同一过程中,因此内核无需在线程之间互相调用。

  4)可执行执行

  在一个过程中的多个线程之间,它可以同时执行,甚至允许所有线程在一个过程中执行;同样,也可以同时执行不同过程中的线程,从而充分利用并施加处理器和外围设备。并行工作的能力。

  线程的实现可以分为两类:

  用户级线程和内核级线程也称为螺纹或轻巧的过程,由内核支持。在多线程操作系统中,每个系统的实现都不相同。用户 - 级线程在某些系统中实现,并且内核 - 级线程在某些系统中实现。

  用户线程和内核线程之间的区别:

  1. OS内核感知了内核支持线程,并且用户级别的线程与OS内核密不可分。

  2.用户级线程的创建,取消和调度不需要OS内核的支持,OS内核是在语言级别(例如Java)进行处理的;内核支持线程的创建,取消和调度需要OS内核来提供支持,并且随着创建,取消和调度的过程通常相同。

  3.用户 - 级别的线程执行系统调用指令将导致其过程中断,当内核支持线程执行系统调用指令时,仅会导致线程中断。

  4.在仅具有用户 - 级线程的系统中,CPU调度仍在运行过程中处理过程中,并且控制用户程序控制线程的旋转操作;在具有内核支持线程的系统中,CPU调度线程用作单元,并且OS线程计划的时间表负责线程的调度。

  5.用户 - 级线程的程序实体是在用户状态下运行的程序,而支持线程的内核实体可以在任何状态下运行程序。

  内核线程的优点和缺点:

  优点:当有多个处理器时,可以同时执行过程的多个线程。

  缺点:内核的时间表。

  用户线程的优点和缺点:

  优势:

  线程的调度不需要直接参与核心,并且控件很简单。

  它可以在不支持线程的操作系统中实现。

  构建和破坏线程和线程开关成本的成本远低于内核线程。

  每个过程都可以自定义自己的调度算法,并且线程管理更加灵活。

  线程的表面空间和堆栈空间可以使用比内核级别的线程更多。

  在同一过程中,只能同时运行一个线程。如果通过系统调用阻止线程,则将悬挂整个过程。此外,这些页面将引起相同的问题。

  缺点:

  资源调度是根据过程执行的。在多个处理器下,同一过程中的线程只能在同一处理器下重复使用。

  最近,我正在做一个相关的项目。整个电线的整个电台爬网确实不大,而且也厌倦了一次跑步。在这里有几个主要问题(关于Python的python多线程的吉尔问题,都不再提及,有几个主要问题在线太多)。

  首先,由于多线程可以缩短程序的运行时间,因此线程数量越大,越好?

  显然,每个线程都不是世代相传的。太多的线程会占用太多的系统资源(内存开销,CPU开销),并且生成太多线程时间是相当多的。这是最佳线程数量的计算方法:

  获得最佳线程号:

  1.慢慢通过用户增加性能压力测试,观察QPS(即每秒响应请求的数量,即最大吞吐量。),响应时间

  2.根据公式计算:服务器端的最佳线程号=((线程等待时间+线程CPU时间)/线程CPU时间) * CPU数量

  3.单用户压力测试,检查CPU消耗,然后直接乘以百分比,然后执行压力测试。通常,最好的线程接近该值的值。

  2.为什么要使用线程池?

  对于任务数量不断增加的过程,每个任务都会生成一个线程,这最终将导致线程数的失控。获取此链接对应于相应页面上的新链接。作为一项新任务,目前必须为这些新链接生成新线程,并且线程数量飙升。在后续操作中,线程数将继续增加,并且无法完全控制。对于增加任务数量的过程,需要一个带有许多固定线程的线程池。

  如何使用线程池

  过去,使用了螺纹池模块,现在使用并发模块通常使用。该模块是Python3随附的模块。但是,也可以安装和使用Python2.7的版本。

  注意:

  conturrent.futures.threadpoolexecutor,在提交任务时,有两种方法是cumber()函数,另一个是map()函数。两者之间的主要区别是:

  结论:以上是首席CTO的全部内容指出,有关Python的记忆占多数的记忆。感谢您花时间阅读此网站。我希望这对您有帮助。不要忘记在此网站上找到它。