并发编程之协程
一、线程池和进程池的shutdown
二、定时器
三、协程总结介绍
对于单线程下,我们不可避免程序中出现io操作,但如果我们能在自己的程序中(即用户程序级别,而非操作系统级别)控制单线程下的多个任务能在一个任务遇到io阻塞时就切换到另外一个任务去计算,这样就保证了该线程能够最大限度地处于就绪态,即随时都可以被cpu执行的状态,相当于我们在用户程序级别将自己的io操作最大限度地隐藏起来,从而可以迷惑操作系统,让其看到:该线程好像是一直在计算,io比较少,从而更多的将cpu的执行权限分配给我们的线程。
协程的本质就是在单线程下,由用户自己控制一个任务遇到io阻塞了就切换另外一个任务去执行,以此来提升效率。为了实现它,我们需要找寻一种可以同时满足以下条件的解决方案:
# 协程要解决的问题:保存状态+切换
# yield:生成器,只要函数中有yield关键字,这个函数就是生成器,通过yield可以实现保存状态+切换
2、gevent模块
四、asyncio(官方支持的协程的库)
# import time # import asyncio # # # 把普通函数变成协程函数 # # 3.5以前这么写 # @asyncio.coroutine # def task(): # print('开始了') # yield from asyncio.sleep(1) #asyncio.sleep(1)模拟io # print('结束了') # # # loop=asyncio.get_event_loop() # 获取一个时间循环对象# # # # 协程函数加括号,并不会真正的去执行,它需要提交给loop,让loop循环着去执行 # # 协程函数列表 # # ctime=time.time() # t=[task(),task()] # loop.run_until_complete(asyncio.wait(t)) # loop.close() # print(time.time()-ctime) import time import asyncio from threading import current_thread # 表示我是协程函数,等同于3.5之前的装饰器 async def task(): print('开始了') print(current_thread().name) await asyncio.sleep(3) # await等同于原来的yield from print('结束了') async def task2(): print('开始了') print(current_thread().name) await asyncio.sleep(2) print('结束了') loop=asyncio.get_event_loop() ctime=time.time() t=[task(),task2()] loop.run_until_complete(asyncio.wait(t)) loop.close() print(time.time()-ctime)
五、补充虚拟环境
总结:
```python
1 解决不同项目依赖的模块版本不同的问题
2 pycharm中创建项目时选择
-这个虚拟环境可不可以给其他项目使用(取决你是否选择)
-基于系统解释器当前状态还是纯净状态来创建虚拟环境
3 装模块:
-cmd窗口下:pip3 install flask (装在谁下,你一定要确认好)
-推荐你们用pycharm:setting---》那一套
-pycharm下的terminal下装(相当于cmd),比cmd好在,它有个提示
4 现在用了虚拟环境如何换到系统环境
4 环境变量的作用
-把一个路径加入到环境变量,以后该路径下的命令,可以再任意位置执行
```