01.进程
https://www.cnblogs.com/xiaonq/p/7905347.html
1.1 什么是进程?
-
1、进程是资源分配的最小单位(内存、cpu、网络、io)
-
2.一个运行起来的程序就是一个进程
- 什么是程序(程序是我们存储在硬盘里的代码)
1、硬盘(256G、内存条(8G)
2、当我们双击图标,打开程序的时候,实际上就是通过I/O操作(读写),硬盘中的代码读取到内存条里
- 什么是程序(程序是我们存储在硬盘里的代码)
-
内存条就是我们所指的资源(程序分配了内存资源,就变成了进程)
-
CPU分时
- CPU比你的手速快多了,分时处理每个线程,但是由于太快然你觉得每个线程都是独占cpu
- cpu是计算,只有时间片到了,获取cpu,线程真正执行
- 当你想使用 网络、磁盘等资源的时候,需要cpu的调度
-
进程具有独立的内存空间,所以没有办法相互通信
1.2 进程如何通信?
-
同一程序下进程通信
不同进程间内存是不共享的,所以互相之间不能访问对方数据
法1: 利用Queues实现父进程到子进程(或子进程间)的数据传递
法2: 使用管道pipe实现两个进程间数据传递
法3: Managers实现很多进程间数据共享
法4:借助redis中间件进行数据共享 -
Java项目和python项目如何通信
- RabbitMQ、redis等(不同程序间通信)
进程优点
提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率
进程缺点
第一点:进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。
b. 第二点:进程在执行的过程中如果阻塞,即使进程中有些工作不依赖于输入的数据,也将无法执行(例如等待输入,整个进程就会挂起)。
c. 例如,我们在使用qq聊天, qq做为一个独立进程如果同一时间只能干一件事,那他如何实现在同一时刻 即能监听键盘输入、又能监听其它人给你发的消息
1.3 为什么需要进程池?
- 一次性开启指定数量的进程
- 如果有十个进程,有一百个任务,一次可以处理多少个(一次性只能处理十个)
- 防止进程开启数量过多导致服务器压力过大
- 进程池中有两个方法:
- 1)apply: 多个进程异步执行,一个一个的执行
- 2)apply_async: 多个进程同步执行,同时执行多个进程
from multiprocessing import Process,Pool
import time,os
def foo(i):
time.sleep(2)
print("in the process",os.getpid()) #打印子进程的pid
return i+100
def call(arg):
print('-->exec done:',arg,os.getpid())
if __name__ == '__main__':
pool = Pool(3) #进程池最多允许5个进程放入进程池
print("主进程pid:",os.getpid()) #打印父进程的pid
for i in range(10):
#用法1 callback作用是指定只有当Foo运行结束后就执行callback调用的函数,父进程调用的callback函数
pool.apply_async(func=foo, args=(i,),callback=call)
#用法2 串行 启动进程不在用Process而是直接用pool.apply()
# pool.apply(func=foo, args=(i,))
print('end')
pool.close() #关闭pool
pool.join() #进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
02、线程
-
有了进程为什么还需要线程?
因为进程不能同一时间只能做一件事 -
什么是线程
- 线程是操作系统调度的最小单位
- 线程是进程正真的执行者,是一些指令的集合(进程资源的拥有者)
- 同一个进程下的读多个线程共享内存空间,数据直接访问(数据共享)
- 为了保证数据安全,必须使用线程锁
1.1. 进程和线程的区别
进程包含线程
2、线程共享内存空间
3、进程内存是独立的(不可互相访问)
4、进程可以生成子进程,子进程之间互相不能互相访问(相当于在父级进程克隆两个子进程)
5、在一个进程里面线程之间可以交流。两个进程想通信,必须通过一个中间代理来实现
6、创建新线程很简单,创建新进程需要对其父进程进行克隆。
7、一个线程可以控制或操作同一个进程里面的其它线程。但进程只能操作子进程。
8、父进程可以修改不影响子进程,但不能修改。
9、线程可以帮助应用程序同时做几件事
03、什么是协程
- 协程,又称微线程,纤程,协程是一种用户态的轻量级线程。
- 线程的切换会保存到CPU的栈里,协程拥有自己的寄存器上下文和栈,
- 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈
- 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态
- 协程最主要的作用是在单线程的条件下实现并发的效果,但实际上还是串行的(像yield一样)