layabout4233629 / layabout

用来写写自己学习的技术心得,如果对您有帮助,别忘了加“星”
1 stars 0 forks source link

python3里的asyncio #11

Open layabout4233629 opened 4 years ago

layabout4233629 commented 4 years ago

关于threading

threading就类似C/C++的线程了,使用上也非常类似。

关于asyncio

服务器因为资源有限,在处理并发的时候每个请求是不能用单独的任务来处理的,同理当并发超过一定数量级的时候,线程的资源也被耗尽。所以GO等后面出来的语言就有了针对并发场景但又避免创建线程的概念协程。一定要注意,可以并发的场景才考虑用协程。 为了适配并发,python3提供了asyncio库。asyncio提供的框架以事件循环(event loop)为中心,程序开启一个无限的循环,程序会把一些函数注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。 一个简单的例子

import asyncio

async def foo():
    print("这是一个协程")

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    try:
        print("开始运行协程")
        coro = foo()
        print("进入事件循环")
        loop.run_until_complete(coro)
    finally:
        print("关闭事件循环")
        loop.close()

输出

开始运行协程
进入事件循环
这是一个协程
关闭事件循环

从C/C++转型的我,原来以为只有进程和线程两个概念。到了python这里又多了一个“协程”的概念。实际协程还是线程的概念,只是比python里的线程可能更高效一点,同时Asyncio运行时不会被外部的因素打断,所以【不必担心线程安全问题】。

要注意:可等待 对象有三种主要类型: 协程, 任务 和 Future。Future 是一种特殊的 低层级 可等待对象,表示一个异步操作的 最终结果。