进程、线程、协程

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、什么是协程

  1. 协程,又称微线程,纤程,协程是一种用户态的轻量级线程。
  2. 线程的切换会保存到CPU的栈里,协程拥有自己的寄存器上下文和栈,
  3. 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈
  4. 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态
  5. 协程最主要的作用是在单线程的条件下实现并发的效果,但实际上还是串行的(像yield一样)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值