进程线程协程

Posted gkl123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程线程协程相关的知识,希望对你有一定的参考价值。

进程

进程是系统进行资源分配和调度的一个独立单位,每个进程都有自己独立的内存空间,不同进程通过进程间通信来通信

线程

线程是进程的一个实体,是CPU调度和分配的基本单位,可与同属于一个进程的其他线程共享进程所拥有的全部资源

协程

协程是一种用户态的轻量级线程,协程的调度完全由用户控制

进程与线程区别

线程是指进程内的最小执行单元,也是进程内的可调度实体

  • 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,他们共享进程的地址空间,而进程有自己独立的地址空间

  • 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

  • 二者均可并发执行

协程与线程

  • 一个线程可以有多个协程

  • 线程进程都是同步机制,协程是异步

  • 协程能保留上一次的状态,每次过程重入时,就相当于进入上一次调用的状态

 

进程线程协程在python中的作用

  • 多进程一般使用multiprocessing库,来利用多核CPU,主要用在CPU密集型的程序上,生产者消费者也可以使用。多进程的优势是一个子进程崩溃并不影响其他子进程和和主进程的运行,缺点是不能一次性启动太多进程,会严重影响系统的资源调度,特别是CPU使用率和负载

  • 多线程使用threading库,完成一些IO密集型并发操作。多线程的优势是切换快,资源消耗低,但一个线程挂掉会影响到所用线程,所以不稳定,一般使用线程池

  • 协程一般使用gevent库,多用在web方向是

  • IO密集型一般使用多线程或者多进程,CPU密集型一般使用多进程,强调非阻塞异步并发的一般使用协程

 

 

技术分享图片
 1 import multiprocessing
 2 import time
 3 
 4 
 5 def func_1(name):
 6     print("hello", name)
 7     time.sleep(2)
 8 
 9 
10 def func_2():
11     print("你好!")
12     time.sleep(2)
13 
14 
15 pro1 = multiprocessing.Process(target=func_1, args=("gkl", ))
16 pro1.start()
17 func_2()
进程
你好!
hello gkl

 

 

技术分享图片
 1 import multiprocessing  # 导入多进程模块
 2 
 3 
 4 mar = multiprocessing.Manager()   # 创建一个进程空间,并返回与其通信的管理器
 5 mar_list = mar.list()   # 通过管理器在服务器进程中开辟一个列表空间,并返回一个代理
 6 mar_list.append("天气不错!!!")  # 导入数据 方法和列表一致
 7 print(mar_list)
 8 
 9 
10 def sub_process(li):
11     li.append("今天星期二")
12 
13 
14 # 把代理传给子进程,子进程就可以通过这个代理来操作共享空间进行通信
15 pro = multiprocessing.Process(target=sub_process, args=(mar_list, ))
16 pro.start()  # 运行
17 pro.join()  # 阻塞  等待子进程完成后继续运行
18 print(mar_list)
进程间通信

 

[天气不错!!!]
[天气不错!!!, 今天星期二]

 

 

技术分享图片
 1 import threading
 2 
 3 
 4 data = 0
 5 lock = threading.Lock()  # 创建一把锁  防止计算混乱  同一进程下的线程共享变量,容易发生紊乱
 6 
 7 
 8 def add():
 9     global data
10     for i in range(100000):
11         with lock:     # 锁 (加锁、释放锁)
12             data += 1
13 
14 
15 def sub():
16     global data
17     for i in range(100000):
18         with lock:
19             data -= 1
20 
21 
22 add_td = threading.Thread(target=add)
23 add_td.start()
24 sub_td = threading.Thread(target=sub)
25 sub_td.start()
26 add_td.join()
27 sub_td.join()
28 print(data)
线程间通信

运行结果为0

 

 

 

 

 

以上是关于进程线程协程的主要内容,如果未能解决你的问题,请参考以下文章

python 多进程,多线程,协程

进程线程协程

进程线程协程的区别

进程_线程 之 --- 协程

协程

进程线程和协程的区别