多线程python和多进程的区别

上一章我们介绍了Socket和SocketServer网络编程。

SocketServer服务器代码包含这句话:

server=socketserver.ThreadingTCPServer((ip,port),MyServer)

ThreadingTCPServer类是一个SocketServer,它支持多线程和TCP协议,其继承关系system如下:

classThreadingTCPServer(ThreadingMixIn,TCPServer):pass

右边的TCPServer实际上是主要的是功能基类,而左边的ThreadingMixIn实现了多线程。
线程类ThreadingTCPServer本身不包含任何代码。

Mixin在Python类命名中很常见,称为“mixingin”,戏称“mixingin”。
它通常由子类继承来实现一些重要的功能。

我们看一下ThreadingMixIn的源码:

classThreadingMixIn:daemon_threads=Falsedefprocess_request_thread(self,request,client_address):try:self.finish_request(request,client_address)self.除了shutdown_request(request):self.handle_error(request,clientt_address)self.shutdown_request(request)defprocess_request(self,request,client_address):t=threading.Thread(target=self.process_request_thread,args=(request,client_address))t.daemon=self.daemon_threadst.start()

在ThreadingMixIn类中,其实有一个属性和两个方法。
定义于.process_request()方法实际上调用了Python内置的多线程模块threading。
该模块是Python中所有多线程的基础,SocketServer本质上就使用了该模块。

SocketServer通过线程模块实现多线程任务处理能力,可以同时为多个客户端提供服务。

那么,什么是线程,什么是进程呢?

进程是程序(软件、应用程序)的执行实例。
每个正在运行的程序同时可以创建多个进程,但必须至少有一个。
每个进程提供执行程序所需的所有资源,包括虚拟地址空间、可执行代码、操作系统接口、安全上下文(记录启动进程的用户和权限等)以及唯一的进程ID。
发生。
环境变量、优先级、最小和最大范围(内存空间)。
进程可以有线程,并且每个进程必须至少有一个线程。
每个进程启动时,首先会派生出一个线程,即主线程,然后主线程再创建其他子线程。

线程,有时也称为轻量级进程(LightweightProcess,LWP),是程序执行流程的最小单元。
标准线程具有线程ID、当前指令指针(PC)、寄存器组和堆栈。
此外,线程是进程中的一个实体,是系统独立调度和分派的基本实体。
线程本身并不独立拥有系统资源,但它可以与属于同一进程的其他线程共享该进程拥有的所有资源。
每个应用程序至少有一个进程和一个线程。
在一个程序中同时运行多个线程,分片完成不同的任务,称为多线程。

举个例子,一家公司要生产一种产品,所以在其生产基地建设了几个工厂,每个工厂有几条生产线。
有吗。
所有工厂合作生产完整的产品。
工厂中的装配线负责为其所属工厂生产产品组件。
每个工厂都有自己的材料库,工厂内的生产线共享这些材料。
一个企业要实现生产,必须至少拥有一个工厂和一条生产线。
切换到计算机的概念,公司就是应用程序,工厂就是应用程序的进程,生产线就是某个进程的线程。

线程的特点:

线程是一个执行上下文,是CPU执行所需的一系列指令。
假设您正在读一本书,但尚未读完,想要休息一下,但回来后又想继续原来的操作。
一种方法是记下页数、行数和字数三个值。
这些值是执行参考。
如果你的室友正在闲暇时阅读这本书,请使用相同的方法。
你和他只要写下这三个数字,就可以轮流一起看书了。

线程统一工作。
CPU会给你一种它可以同时执行多个操作的错觉。
事实上,它在每次操作上花费的时间很少。
简而言之,CPU一次只能做一件事——所谓的多线程和并发处理只是一种幻想。
CPU可以做到这一点,因为它对每个任务都有一个执行上下文,就像你在电脑上读同一本书一样。
可以与朋友分享。

进程和线程的区别:

同一进程内的线程共享相同的内存空间,但进程之间的内存空间是独立的。

同一进程内线程之间的数据是共享的,但进程之间的数据是独立的。

对主线程的修改可以影响其他线程的行为,但对父进程的修改(删除除外)不会影响其他子进程。

线程是单个执行指令,而进程是与操作相关的一组资源。

同一进程内的线程可以直接通信,但进程间的通信需要借助中间代理。

创建新线程很容易,但创建新进程需要原始进程的副本。

线程可以操作同一进程的其他线程,但进程只能操作其子进程。

线程启动速度较快,进程启动速度较慢(但两者的运行速度没有可比性)。

由于现代CPU已经进入多核时代,核心频率较过去有了很大的提高,多线程、多进程编程已经成为主流。
已经走了。
Python完全支持多线程和多进程编程,也支持协程。

python中多进程和多线程的区别

什么是流程和流程?进程和线程是基本的操作系统概念。
它们相对抽象且难以掌握。
关于这两句话,最经典的就是“进程是资源分配的最小单位,线程是CPU调度的最小单位”。
线程是程序中的单个顺序控制进程,具有相对独立性和可调度性。
执行单元是系统进行调度和独立CPU分配的基本单元。
是指同时运行的程序的调度单元,以完成程序内不同的任务。
称为多线程。
进程和线程有什么区别?进程是资源分配的基本单位。
所有与进程相关的资源都记录在进程控制块PCB中,以表明该进程拥有这些资源或正在使用它们。
,进程也是抢占式处理器的调度单元,具有完整的虚拟地址空间。
当进程被调度时,不同的进程具有不同的虚拟地址空间,同一进程内的不同线程将共享相同的地址空间。
相对于进程,线程与资源分配无关。
它属于某个进程,并与进程中的其他线程共享该进程的资源。
寄存器和TCB线程控制台,寄存器可以用来存储线程内的局部变量,但不能存储其他线程的相关变量。
通常,一个进程可以包含多个线程,这些线程可以使用该进程拥有的资源。
在引入线程的操作系统中,进程常常被认为是资源分配的基本单位,线程被认为是独立运行、独立规划的。
基本单位。
由于线程比进程小,本质上不占有系统资源,因此调度它们的开销要小得多,可以更有效地提高系统中多个程序之间的并发执行水平,从而显着提高系统利用率和吞吐量。

于是,近年来推出的通用操作系统都引入了线程,进一步提高系统并发运行的能力,作为现代操作系统的一个重要指标。

Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程

Python中常见的并发技术有:多线程和多处理。
多线程适用于I/O密集型任务,多处理适用于计算密集型任务。
在Python中,多线程是通过在单个进程中运行多个线程来实现的。
然而,由于全局解释锁(GIL)的存在,Python多线程实际上是“交错执行”而不是真正的并行。
因此,多线程对于计算密集型任务来说并不理想。
相比之下,多处理允许充分利用CPU资源,特别是对于计算密集型任务。
Python提供了multiprocessing模块等多进程接口,支持进程创建、数据传输等。
进程之间的通信是通过管道或队列来完成的。
为了直观地演示适用的多线程和多处理场景,以I/O密集型任务为例。
首先定义一个队列和一个初始化队列的函数。
然后分别执行I/O密集型任务和计算密集型任务,并从队列中取出任务数据。
通过比较不同并行方法的执行时间,我们可以发现多线程适合I/O密集型任务,而多处理则更适合计算密集型任务。
在实际工作中,通过使用示例代码进行测试,对比多线程和多进程进程完成同一任务所需的时间,发现多进程进程显着提高了计算密集型任务的效率。
代码示例和详细实验结果已上传至GitHub。
欢迎来到:xianhu/LearnPython。
如果您对Python多线程和多处理有任何疑问或建议,请参与GitHub页面上的讨论。
让我们一起交流、共同学习、共同进步вместе.

python多线程与多进程的区别是什么?

多线程和多处理是运行计算机程序时两种不同的并行模型。
想象一下一家繁忙的餐厅来解释其中的差异。
多重处理就像开设一家餐馆的分店。
每个店都有自己独立的服务员,每个人独立工作,满足顾客的不同需求,互不影响。
多线程类似于同一家餐厅,但服务员更多。
这些服务器位于同一个房间,为同一家餐厅提供服务,并且可以同时处理多个订单,从而提高了效率。
在多线程中,还有协程(异步)的概念,意思是服务员可以处理下一个订单,直到上一个订单完成,以提高效率。
但是,如果餐厅中的服务员由于争夺资源(例如售票机或工作屏幕)而相互阻塞,则可能会导致线程死锁。
Python通过使用全局解释器锁(gil锁)来防止此类死锁,但这也限制了CPU密集型任务中的多线程性能。
餐厅里的顾客正在寻找服务员点菜。
如果多个顾客同时寻找同一个服务员,导致排队,这就是阻塞情况。
异步、单线程、非阻塞模式允许餐厅允许多个顾客在不同时间完成订单而无需等待,从而实现并发。
异步、多线程、非阻塞模式,利用多个服务员的分工协作,让多个顾客无需等待即可完成订单,同时还可以实现并发。
同步多线程非阻塞模式允许同时排序,但需要服务员协调以避免资源争用。
单流餐厅不太容易出现僵局问题。
通过理解多线程和多处理之间的本质区别,您已经掌握了并行的基本部分Python编程你就可以开始练习了。