一、多线程与多进程概念:
进程:os中每个任务就是一个进程
线程:一个进程有很多线程,每个线程做一件事;
一个进程中有多个线程就是多线程;
单核计算机也可以实现多进程与多线程;
线程与进程切换由操作系统来决定。
二、多线程的问题:
线程不安全:不多线程中,变量是共享的,多个线程同时操作一个变量会引发变量的数据异常;
GIL全局解释器锁:每个进程一把锁,启动线程先加锁,结束线程释放锁;
复杂程序的分类:CPU密集型和IO密集型
IO操作耗时越长,多线程效率越高;
三、同步与异步:
同步:前一个操作执行完才能进行下一个操作,在此期间主线程为阻塞状态
异步:所有操作同时启动,主线程挂起,等待所有子线程完成(CPU不会傻等)
区别:CPU在当前线程阻塞情况下可以去做其他事情
四、协程
协程是在线程的基础上实现的,可以控制执行顺序与关联,一种高耦合程序设计模式;
一个线程内可以有多个协程;
遇到阻塞,cpu会切换到其他协程工作;
创建协程开销比进程与线程开销低;
五、生成器:
循环的过程中不断推算出后续的元素,这样就可以不必创建完整的list,这种一边循环一边计算的机制,称为生成器:generator
两种定义:
1.列表生成式:
g = (x * x for x in range(10))
2.带yield的generator function
六、协程函数与状态
因为生成器的调用方也就是程序员自己可以控制生成器的启动、暂停、终止,而且可以向生成器内部传入数据,所以这种生成器又叫做协程,generator 函数叫做生成器函数或者协程函数
GEN_CREATED 创建完成,等待执行
GEN_RUNNING 解释器正在执行
GEN_SUSPENDED 在 yield 处等待下次next调用
GEN_CLOSE 执行结束,生成器停止
七、yield from
Python3.3后加入了yield from
有yield from的语句叫协程函数或生成器函数
yied from 代替for循环,避免循环嵌套,返回一个新的迭代器,后面接受一个可迭代对象
八、asyncio 模块
创建协程函数需使用asyncio.coroutine装饰器标记;
协程对象:使用asyncio.coroutine 装饰器装饰的函数被称作协程函数,它的调用不会立即执行函数,而是返回一个协程对象
task任务:
将协程对象作为参数创建任务,任务是对协程进一步封装,其中包含任务的各种状态
event_loop事件循环:
事件循环能够控制任务运行流程。