G/even程池协程
目录
Event事件
Event事件的作用
用来控制线程的执行
通过一些线程可以去控制另一些线程
使用方法
from threading import Event
from threading import Thread
improt time
e =Event()
def light():
print('红灯亮...')
time.sleep(1)
# 应该开始发送信号,告诉其他线程准备执行
e.set() # 将car中的False————True
print('绿灯量...')
def car(name):
print('正在等红灯')
# 让所有汽车进入阻塞状态
e.wait() # Flase
print(f'{name}正在加速飘逸)
t = Thread(target=light)
t.start()
for line in range(10):
t=Thread(target=car,args=(f'{line}号))
t.start()
线程池与进程池
什么是进程池与进程池:
进程池与线程池是用来控制当前程序允许创建(进程/线程)的数量
进程池与线程池的作用
保证在硬件允许的范围内创建(进程/线程)的数量
使用方法
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import time
pool= ThreadPoolExecutor(5)
def task():
print('线程任务开始了...')
time.sleep(1)
print('线程任务结束了')
for lien in range(5):
pool.submit(task)
def task():
print('线程任务开始了...')
time.sleep(1)
print('线程任务结束了')
def call_back(res):
res2=res.result()
print(res2)
for lien in range(5):
pool.submit(task).add_done_callbacke(call_back)
协程
进程:资源单位
线程:执行单位
协程:在单线程下实现并发
注意:
协程不是操作系统资源,同时程序员起的名字,为了让单线程能够实现并发。
协程的目的:
操作系统:
多道技术,切换+保存状态
遇到io或者cpu执行时间长都会交换cpu的使用权
协程:
用过手动模拟操作系统多道技术,实现切换+保存状态
手动实现遇到io切换,欺骗操作系统误以为没有io操作
注意
单线程与引导io,切换+保存状态
单线成 计算密集型,来回切换+保存状态反而效率更低
优点:
在IO密集型的情况下, 会提高效率.
缺点:
若在计算密集型的情况下, 来回切换, 反而效率更低.
如何实习协程:切换加保存状态
yield:保存状态
并发:切换
使用方法
from gevent import mokey
mokey.patch_all() # 可以监听程序下所有的io操作
import time
from gevent import spawn,joinall # 用于做切换 + 保存状态
func1():
print('1')
time.sleep(1)
func2():
print('2')
time.sleep(3)
func3():
print('3')
time.sleep(4)
s1=spawn(func1)
s2=spawn(func2)
s3=spawn(func3)
joinall([s1,s2,s3])