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])
posted @ 2019-10-24 22:11  鸿鸿1  阅读(164)  评论(0编辑  收藏  举报