多线程和多进程
文章平均质量分 74
涉及多进程和多线程以及协程
敲代码敲到头发茂密
欲戴王冠,必承其重
展开
-
python面试题——什么是GIL ;什么时候释放GIL锁;互斥锁(同步锁)和GIL的区别
多线程编程时通过调用threading模块的Lock函数,来获取一把互斥锁。互斥锁就是对共享数据进行锁定,保证同一时刻只有一个线程操作数据,是数据级别的锁。GIL锁是解释器级别的锁,保证同一时刻进程中只有一个线程拿到GIL锁,拥有执行权限。...原创 2022-08-12 13:42:32 · 2168 阅读 · 42 评论 -
关于进程、线程、协程、同步、异步、阻塞、非阻塞、并发、并行、串行的理解
二、线程三、协程七、非阻塞八、并发九、并行十、串行原创 2022-07-06 00:02:50 · 958 阅读 · 32 评论 -
进程、线程和协程的区别
1原创 2021-11-06 07:00:00 · 1393 阅读 · 4 评论 -
多线程面试题汇总
使用其他语言写的python解析器(不推荐,还是用python官方的CPython好)不使用多线程,使用多进程-进程里面加协程实现多任务来充分利用多核CPU(推荐)即使存在GIL,在有IO等待操作的程序中,还是多线程快;当然没有资源等待的还是使用单线程快(科学计算、累加等等)但是需要注意的是线程有了GIL后并不意味着使用python多线程时不需要考虑线程安全,GIL的存在是为了方便使用C语言CPython解释器的编写者,而顶层使用python时依旧要考虑线程安全。原创 2024-02-16 22:41:17 · 1234 阅读 · 49 评论 -
多进程面试题汇总
顾名思义,就是进行中的程序。进程是python中最小的资源分配单元,进程之间的数据,资源是不共享的、是隔离的;每启动一个进程,都要独立分配资源和拷贝访问的数据;进程是重量级别的,在进程中,需要处理的问题包括进程间通信,临界区管理和进程调度,所以进程的启动和销毁的代价是比较大的。1、windows任务管理器中的每个任务都是一个进程2、进程可以直接占用CPU、内存、磁盘、网络、GPU3、打开一个浏览器就是,就是启动了一个浏览器进程;打开一个记事本,就是启动了一个记事本进程。原创 2024-02-15 23:18:17 · 1063 阅读 · 34 评论 -
python——GIL锁详解
对于IO密集型应用,即便有GIL存在,由于IO操作会导致GIL释放,其他线程能够获得执行权限。由于多线程的通讯成本低于多进程,因此偏向使用多线程。对于计算密集型应用,由于CPU一直处于被占用状态,GIL锁直到规定时间才会释放,然后才会切换状态,导致多线程处于绝对的劣势,此时可以采用多进程+协程。原创 2022-11-21 08:30:30 · 7847 阅读 · 38 评论 -
python——全局解释器锁(GIL)
顾名思义,就是正在运行中的程序。是操作系统中分配任务的最小基本单元;线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己不拥有系统资源;但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。原创 2022-10-14 10:43:42 · 4616 阅读 · 15 评论 -
python—进程总结
2、multiprocessing中的队列,专为python多进程(Process)数据共享而设计的(多个进程的数据传输)——multiprocessing.Queue()3、multiprocessing.Manager().Queue():python中进程池通信专用的队列。1、queue模块中的队列(Queue),它只能用于单个进程中(多个线程之间的数据共享)q=Manager().Queue():使用进程池专用的队列进行数据传输。进程的创建由用户控制,进程的调度、执行、阻塞调度由操作系统控制。原创 2022-09-30 09:22:10 · 664 阅读 · 20 评论 -
python——线程总结
ProcessPoolExecutor:进程池ThreadPoolExecutor:线程池t1 = ThreadPoolExecutor(max_workers=5):创建一个线程池,线程池中最多支持同时执行多少个任务t1.submit(函数名称):往线程池中提交执行的任务t1.shutdown():等待线程池中所有的任务执行完毕之后,开始执行。原创 2022-09-29 11:14:07 · 1148 阅读 · 18 评论 -
python面试题之进程总结
进程:程序运行在操作系统上的一个实例,就称之为进程。进程需要相应的系统资源:内存、时间片、pid。 创建进程: 首先要导入multiprocessing中的Process: 创建一个Process对象; 创建Process对象时,可以传递参数;执行结果:执行结果:执行结果:在初始化Queue()对象时(例如q=Queue(),若在括号中没有指定最大可接受的消息数量,获数量为负值时,那么就代表可接受的消息数量没有上限一直到内存尽头)Queue.qsize():返回当前队列包含的消息数量Queue.em原创 2022-06-21 08:00:52 · 422 阅读 · 16 评论 -
串行、并行、并发总结
1原创 2021-11-05 07:00:00 · 771 阅读 · 0 评论 -
python—协程
1原创 2021-11-02 07:00:00 · 296 阅读 · 0 评论 -
多线程通信—生产者和消费者模式
1、队列Queue:从一个线程向另一个线程发送数据最安全的方式可能就是使用queue库中的队列了。创建一个被多个线程共享的Queue对象,这些线程通过使用put()和get()操作来向队列中添加或者删除元素。Queue对象已经包含了必要的锁,所以你可以通过它在多个线程间多安全地共享数据。2、创建一个队列q = queue.Queue(1000) 创建一个先进先出的队列q=queue.LifoQueue 创建一个后进先出的队列q=queue.PriorityQueue 优先级原创 2021-11-04 07:00:00 · 412 阅读 · 0 评论 -
多线程—事件Event
线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象,而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真;它原创 2021-10-30 07:00:00 · 640 阅读 · 0 评论 -
多线程—异步执行
一、同步和异步的区别:案例:同步:就是女儿叫你起床,你还没有起来,她一直在床边等着也不去早读,等你起来之后,再去单读。异步:就是女儿叫你起床,你还没有起来,她对着你房间喊一声"起床了",然后就不管了,自己去早读了。二、异步应用1、为完成某个任务,不同程序单元之间过程中无需通信协调,也能完成任务的方式。2、不相关的程序单元之间可以是异步的。3、例如,爬虫下载网页。调度程序调用下载程序后,即可调度其他任务,而无需与该下载任务保持通信以协调行为。不同网页的下载、保存等操作都是无关的,也无需相互通知协原创 2021-11-03 07:00:00 · 1244 阅读 · 0 评论 -
python—多线程定义和创建(一)
一、线程的理解线程是"轻量级""的,一个进程中的线程使用同样的地址空间,且共享许多资源。启动线程的时间远远小于启动进程的时间和空间,而且,线程间的切换也要比进程间的切换快得多。由于使用同样的地址空间,所以线程之间的数据通信比较方便,一个进程下的线程之间可以直接使用彼此的数据。当然,这种方便性也会带来一些问题,特别是同步问题。。多线程对于那些I/O受限的程序特别适用。二、线程分类:内核线程:由操作系统内核创建和撤销。用户线程:不需要内核支持而在用户程序中实现的线程。三、线程的生命周期一个线程在原创 2021-10-13 07:00:00 · 375 阅读 · 1 评论 -
python—多线程之信号量
一、信号量设置在多线程中,并行运行的线程个数我们都知道在加锁的情况下,程序就变成了串行,也就是单线程,而有时,我们在不用考虑数据安全时(不修改数据),不用加锁,程序就变成了并行,也就是多线程。为了避免业务开启过多的线程时。我们就可以通过信号量,(Semaphore)来设置指定个数的线程。举个简单例子:车站有3个安检口,那么同时只能有3个人安检,别人来了,只能等着别人安检完才可以过。二、代码semapshore = threading.BoundedSemaphore(3) :一次只允许3个人同时过安原创 2021-10-16 06:30:00 · 1165 阅读 · 0 评论 -
python—多线程数据混乱问题解决之同步锁
一、同步问题产生的原因就是没有控制多个线程对同一资源的访问,对数据造成破坏,使得线程运行的结果不可预期。这种现象称为"线程不安全”"。同步:就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。这既是同步,二、同步锁1、lock=Lock():创建同步锁2、lock.acquire():获得这把锁的钥匙3、lock.release():释原创 2021-10-14 07:51:48 · 2257 阅读 · 1 评论 -
python—多线程之死锁
一、造成死锁的原因1、在多线程程序中,死锁问题很大一部分是由于线程同时获取多个锁造成的。2、在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。3、尽管死锁很少发生,但一旦发生就会造成应用的停止响应。二、产生死锁的四个原因1、互斥条件:一个资源每次只能被一个线程使用。2、请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。3、不剥夺条件:线程已获得的资源,在末使用完之前,不能强行剥夺。4、循环等待条件:若干线程之间形成一种头尾相接的循原创 2021-10-15 06:45:00 · 3150 阅读 · 1 评论 -
python—多线程之数据混乱问题
一、加入线程同步的原因由于同一进程中的所有线程都是共享数据的,如果对线程中共享数据的并发访问不加以限制,结果将不可预期,在严重的情况下,还会产生死锁在一个进程内的所有线程共享全局变量,能够在不使用其他方式的前提下完成多线程之间的数据共享(这点要比多进程要好)缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全)二、解决数据混乱的方法为了让线程是安全的,解决方法:1、为了解决这个问题,需要允许线程独占地访问共享数据,这就是线程同步。2、让每个线程拥有一个独立的私有变原创 2021-10-14 06:45:00 · 4185 阅读 · 0 评论 -
python—多线程之守护线程
一、守护线程定义:setDaemon:将线程声明为守护线程,必须在start()方法调用之前设置,如果不设置为守护线程程序会被无限挂起。这个方法基本和join是相反的。当我们在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是只要主线程完成了,不管子线程是否完成,都要和主线程—起退出,这时就可以用setDaemon方法代码如下:输出结果原创 2021-10-13 06:45:00 · 5240 阅读 · 2 评论 -
python—多线程之线程之间共享数据(Queue)
一、Queue理解从一个线程向另一个线程发送数据最安全的方式可能就是使用queue库中的队列了。创建一个被多个线程共享的Queue对象,这些线程通过使用put()和get()操作来向队列中添加或者删除元素。Queue对象已经包含了必要的锁,所以你可以通过它在多个线程间多安全地共享数据。二、原理图三、生产者和消费者生产者:生产数据放到队列中消费者:从队列中获取数据生产者和消费者都可以有多个四、代码q=queue.Queue(1000) 创建一个先进先出的队列,1000代表maxS原创 2021-10-15 07:42:04 · 12118 阅读 · 6 评论 -
python—多线程之共享数据
多线程共享全局变量主线程中的全局变量,作为所有子线程的共享数据在一个进程中,至少有一个线程,这个线程就是当前进程的主线程,执行结果:多线程还可以共享可变的是数据类型原创 2021-10-14 07:15:00 · 984 阅读 · 0 评论 -
python—多进程之进程池
一、进程池1、进程池定义:进程池:可以提供指定数量的进程给用户使用,即当有新的请求提交到进程池中时,如果池未满,则会创建一个新的进程用来执行该请求;反之,如果池中的进程数已经达到规定最大值,那么该请求就会等待,只要池中有进程空闲下来,该请求就能得到执行。2、原理图绿色:子进程没有工作,处于空闲状态(子进程没有调用任务函数)粉色:子进程处于工作状态(子进程调用了任务函数)3、使用进程池的优点1.提高效率,节省开辟进程和开辟内存空间的时间及销毁进程的时间2.节省内存空间4、Pool中的函数原创 2021-10-12 07:00:00 · 5731 阅读 · 1 评论 -
python—多进程之进程之间通信
一、Queue1、导入:from multiprocessing import Queue2、进程间数据通信之Queue示意图:mq.put(i) 子进程1发送数据到队列Queue中,子进程2和子进程3从队列中获取数据Queue可以称为通信的中间件3、需求:我们有两个进程,一个进程负责写(write)一个进程负责读(read)。当写的进程写完某部分以后要把数据交给读的进程进行使用,这时候我们就需要使用到了multiprocessing模块的Queue (队列):write(将写完的数据交给队原创 2021-10-11 07:00:00 · 5123 阅读 · 0 评论 -
python—多进程之进程的创建(一)
一、单核多任务cpu执行原理:10年前:单核多任务cpu运行:整个cpu分割成多个cpu时间片段,每个时间片段执行一个任务,当执行任务1时,任务2和任务3处于等待状态,因为时间片段很短毫秒级别的,所以当把时间拉长为1s时,这些任务都执行了,给人的感官是并行执行的。二、进程:1、什么是进程?打开一个浏览器就是,就是启动了一个浏览器进程;打开一个记事本,就是启动了一个记事本进程。进程是执行任务的基本单元,也是操作系统执行任务的基本单元。进程中包含了程序指令和相关资源的集合,2、查看进程:在wi原创 2021-10-10 16:35:41 · 975 阅读 · 0 评论