一.定义
1. 进程
统资源分配和调度的基本单位,一个程序运行起来进程管理器就可以看到
进程间通信使用消息队列,redis管道
2. 线程
CPU资源分配和调度的基本单位,一个进程下至少有一个线程
3. 协程
单线程下的并发,程序层面控制的任务切换
二. 如何使用
1.开启进程的两种方式
1.写一个类,继承Process,重写类的run方法---》实例化得到对象,对象.start 开启了进程
2.通过Process类实例化得到一个对象,传入任务 ,调用对象.start 开启了进程
2.开启线程的两种方式
1.写一个类,继承Thread,重写类的run方法---》实例化得到对象,对象.start 开启了进程
2.通过Thread类实例化得到一个对象,传入任务 ,调用对象.start 开启了进程
3.开启协程
早期:借助于gevent模块,基于greelet写,使用asyncio包,里面有async和await关键字
使用:
1.必须写在想要开启协程函数之前 async def test()
2.io操作的代码必须使用await
async def test():
a+1
await 遇到io操作的代码
三.使用场景
1.一般遇到计算密集型的操作,开多进程,io密集型的操作,开多线程
2.爬虫爬别人数据,喜欢开多线程,爬虫io居多
3.程序中,异步做一件事情,也可以开多线程,比如一个视图函数异步把数据写的文件中,异步发送钉钉通知,异步发送邮件
4.在项目中,不需要我们开启进程线程,可以借助于第三方的框架比如celery,就可以做异步的操作。celery的worker,就是进程线程架构,django框架支持并发,没有开启多进程和多线程,但是符合uwsgi的web服务器在进入djagno框架之前,开启了进程和线程来执行视图函数。