Python中多线程和多进程详解(python中多线程和多进程详解的区别)
citgpt 2024-09-09 02:15 9 浏览 0 评论
一、多线程与多进程
开始之前先来介绍一下何为进程?进程(Process)实际上表示的就是计算机正在进行的一个任务,比如,打开一个浏览器便是启动一个浏览器进程,打开一个记事本便是启动一个记事本进程。
但是,一个进程未必只能进行一件事,就像一个Word进程,在打字的同时还会有拼写检查,这些在进程内部同时进行的多个“子任务”,就称为线程(Thread)。
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
在以往的单核CPU上,系统执行多进程的方式是通过不断的在多个进程中切换——例如任务1执行0.01秒,切到任务2执行0.01秒再切到任务3……以此类推,而在多核CPU出现后,真正的并行执行多任务才真正的得以实现,但绕是如此,一台计算机同时进行的进程是非常之多的,远远大于CPU的核心数量,因此,操作系统依然会将这些任务轮流调度到每个核心上运行。
多线程的执行方式类似于多进程,也是通过快速切换来达到看起来“同时运行”的目的
如果我们要同时进行多个任务,我们有以下三种方案:
- 写多个程序,然后同时运行
- 在一个程序中运行多个线程
- 多进程+多线程
二、Python多进程编程
多进程:
多进程的实现与你的操作系统有关。例如Unix/Linux操作系统提供了一个fork()系统调用来创建进程。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。
但是Window系统是没有这个系统调用的,因此没办法用fork()实现多进程。Python提供了一个multiprocessing模块来供跨平台版本的Python使用多进程,这个模块提供了一个Process类来代表一个进程对象。
进程池:
如果我们要创建大量的子进程,可以利用进程池的方式来批量创建子进程。
进程池类Pool同样是由模块multiprocess导出。
对于Pool对象,若要调用join()则必须提前调用close(),一旦调用close()则无法再添加新的子进程。(如果不调用close(),它会认为你还要添加子进程故无法执行join() )
三、进程间通信
Python模块multiprcess提供Queue和Pipe类来进行进程间的通信,另外还有很多方式,这里我们先介绍提出的这两种。
Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。Queue通过put()方法把数据插入到队尾,get()方法用于从队头取出数据。并且它们都有两个参数分别为blocked和timeout。当队列已满且blocked为True的时候,如果timeout为正值,则会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,会抛出Queue.Full异常,同理当队列为空且blocked为True的时候,如果timeout为正值,则会等待timeout时间直到有数据插入再取走。若等待时间内没有型数据插入则会抛出Queue.Empty异常。(创建Queue对象时接受一个maxsize参数来限制队列里的对象个数)。
Pipe是方法是实现两个进程通信的另一种方法。Pipe对象分两种,一种为单向管道,一种为双向管道,可以通过构造方法Pipe ( duplex = False ) 来创建单向管道(默认为双向管道)。
Pipe执行任务的方式是,一个进程从Pipe的一端输入对象,然后一个进程从Pipe的另一端接收对象,单向管道只允许管道一端的进程输入,而双向管道则允许从两端输。
调用构造方法Pipe()创建了一个双向管道,实际上是创建了一个由两个单向管道组成的二元组,若是一个进程调用了一个单向管道的send方法,那么另外一个进程就不能再调用这个管道的send方法,我们可以从例子中看到,进程sender用了二元组第一个管道的send,进程recver用了第二个。
四、小结
掌握Python多进程编程技术可以充分利用多核CPU,极大的提高计算机的执行效率,例如在生成随机森林的时候,使用多进程可以提高CART的生成速率等等。
- 上一篇:爬虫入门必学:多线程与多进程的区别
- 下一篇:python中的多任务-多线程和多进程
相关推荐
- js中arguments详解
-
一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...
- firewall-cmd 常用命令
-
目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...
- epel-release 是什么
-
EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...
- FullGC详解 什么是 JVM 的 GC
-
前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...
-
2024-10-26 08:50 citgpt
- 跨域(CrossOrigin)
-
1.介绍 1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。 通俗讲...
- 微服务架构和分布式架构的区别
-
1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...
- 深入理解与应用CSS clip-path 属性
-
clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...
-
2024-10-25 11:51 citgpt
- Request.ServerVariables 大全
-
Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...
- python操作Kafka
-
目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...
- Runtime.getRuntime().exec详解
-
Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...
- promise.all详解 promise.all是干什么的
-
promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...
-
2024-10-24 16:21 citgpt
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracleclient (56)
- springbatch (59)
- oracle恢复数据 (56)
- 简单工厂模式 (68)
- 函数指针 (72)
- fill_parent (135)
- java配置环境变量 (140)
- linux文件系统 (56)
- 计算机操作系统教程 (60)
- 静态ip (63)
- notifyicon (55)
- 线程同步 (58)
- xcode 4 5 (60)
- 调试器 (60)
- c0000005 (63)
- html代码大全 (61)
- header utf 8 (61)
- 多线程多进程 (65)
- require_once (60)
- 百度网盘下载速度慢破解方法 (72)
- 谷歌浏览器免费入口 (72)
- npm list (64)
- 网站打开速度检测 (59)
- 网站建设流程图 (58)
- this关键字 (67)