并发编程之协程

一、线程池和进程池的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 环境变量的作用
 -把一个路径加入到环境变量,以后该路径下的命令,可以再任意位置执行
```

每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)
原文地址:https://www.cnblogs.com/kylin5201314/p/13572221.html