当前位置:   article > 正文

python中的多进程和多线程_python多线程和多进程

python多线程和多进程

1. 多进程和多线程

进程是程序在计算机上的一次执行活动,就是正在运行的应用程序,通常成为进程。每一个进程有自己独立的地址空间(内存空间)。

线程是一个轻量级的子进程,是最小的处理单元;线程是进程的子集,一个进程可以由多个线程组成;

多线程是指有多个线程存在于进程中,这些线程之间共享进程的资源。

进程是资源分配的最小单位,线程是CPU调度的最小单元,一个线程只能属于一个进程,一个进程可以拥有多个线程;

2. Python的多进程

Python的解释器是默认为线程安全的,主要措施是GIL(全局解释性锁,Global Interpret Lock)的机制。因为GIL的存在,Python一次只能有一个线程在运行,多线程不能提高程序的性能,除非有大量的IO操作。多线程适合IO密集型,多进程适合计算密集型

3. 进程和进程池

3.1 multiprocessing.Process

在Python中,进程是通过multiprocessing多进程模块来创建的,multiprocessing提供了一个Process类来创建进程对象。Process类可以单独调用,也可以继承使用.主要操作如下:

  1. Process.start() 启动子进程
  2. Process.join() 等待子进程结束(堵塞等待)
  3. Process.is_alive() 判断子进程是否在运行
  4. Process.close() 结束子进程

3.2 multiprocess.Pool

当需要创建的⼦进程数量不多时, 可以直接利⽤multiprocessing.Process动态生成多个进程, 但如果要创建很多进程时,⼿动创建的话⼯作量会非常大,此时就可以⽤到multiprocessing模块提供的Pool去创建一个进程池。使用进程池的好处就是可以,创建有限的进程来自动并行处理大量的任务。Pool类的主要方法:

  1. Pool.apply() 启动任务(堵塞等待任务完成)
  2. Pool.map() 批量启动任务(堵塞等待任务完成)
  3. Pool.apply_async() 启动任务(非堵塞)
  4. Pool.map_async() 批量启动任务(非堵塞)

4. 进程间的通信

进程是系统分配资源的最小单元,进程之间相互独立,每启动一个新的进程就是相当于吧数据进行了一次克隆,子进程里面的数据修改无法影响到主进程中的数据,不同子进程之间的数据也不共享,这是多进程在使用过程中和多线程最明显的区别。由于进程之间数据是不共享的,所以不会出现多线程GIL带来的问题。python也提供了多种方法实现了多进程中间的通信和数据共享(可以修改一份数据),multiprocessing包支持两种形式多进程之间的通信:Queue和Pipe,这两种方式都是使用消息传递的。

4.1 Queue

Queue创建共享的进程队列,是多进程安全的队列,可以使用Queue实现多进程之间的数据传递,一个进程向队列中写数据,另一个进程从队列中取数据。无论主进程或子进程,都能访问到队列,放进去的对象都经过了深拷贝。
Queue([maxsize]:返回一个使用一个管道和少量锁和信号量实现的共享队列实例。当一个进程将一个对象放进队列中时,一个写入线程会启动并将对象从缓冲区写入管道中。Queue模块的方法有:

  1. qsize():返回当前队列包含的消息数量;
  2. empty():如果队列为空,返回True,反之False ;
  3. full():如果队列满了,返回True,反之False;
  4. get():获取队列中的一条消息,然后将其从列队中移除,可传参超时时长;
  5. get_nowait():相当Queue.get(False),取不到值时触发异常:Empty;
  6. put():将一个值添加进数列,可传参超时时长;
  7. put_nowait():相当于Queue.get(False),当队列满了时报错:Full;

4.2 Pipe

参考:https://zhuanlan.zhihu.com/p/521283266?utm_id=0

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/151570
推荐阅读
相关标签
  

闽ICP备14008679号