【python自动化第十一篇:】
课程简介
- gevent协程
- select/poll/epoll/异步IO/事件驱动
- RabbitMQ队列
上节课回顾
-
进程:
- 进程的诞生时为了处理多任务,资源的隔离,提供程序运行的所有数据
- 进程就是一个程序运行所需要的资源集合
- 每个进程的数据是独立的
- 每个进程至少有一个线程
- 适用于CPU密集型程序(金融分析等。。)
-
线程:
- 线程数据是共享的
- 线程依赖于进程运行
- 适用于IO密集型程序(socket,web,爬虫)
-
总结:
- 一个进程的多个线程可以充分利用多和cpu
- 进程间数据共享的代价是高昂的,所以要尽量避免进程间的数据共享
- 线程要修改同一份数据,必须要加锁(互斥锁mutex)
- event :线程间交互
-
多进程
- multiprocessing
- pipe
- queue :FIFO,LIFO,priority
- pipe和queue实现的是进程间的数据传递和通信
- manager实现了多进程间的数据共享
- multiprocessing
-
生产者消费者模型
- 解耦(降低程序之间的关联)
- 提高程序的运行效率
协程
协程:又称微线程,是一种用户态的轻量级线程
1 . 拥有自己的寄存器上下文和栈,协程调度切换时将寄存器上下文和栈保存到其他的地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。
2 . 协程能够保存上一次调用时的状态(所有局部状态的一个特定组合),每一次过程重入时,就相当于进入上一次调用的状态,换一种说法就是进入上一次离开时所处的逻辑流的位置
- 协程的好处:
- 无需上下文切换的开销
- 无需原子操作锁定以及同步开销
- 方便切换控制流,简化编程模型
- 高并发+高拓展性+低成本:一个CPU支持上万个协程都不是问题,所以很适合高并发处理
- 协程的缺点:
- 无法利用多核资源
- 进行阻塞操作(如IO)会阻塞整个程序
- 小例子:
import queue
import time
def consumer(name):
"""
定义消费者
:param name:
:return:
"""
print("-->starting eating baozi!!")
while True:
new_baozi = yield
print("[%s] is eating baozi %s"%(name,new_baozi))
time.sleep(1) #程序中间有停顿,则会导致程序串行执行
def producer():
"""
定义生产者
:return:
"""
r = con.__next__()
r = con2.__next__()
n = 0
while n<5000000000: #循环5000个包子
n+=1
con.send(n)
con2.send(n)
# print("