为什么现在越来越多的语言开始支持公司?
一般而言,线程堆栈的大小为1MB。如果是多线程,则CPU将主要用于切换线程上下文,并且线程的切换在内核状态下完成,这将消耗额外的额外费用。空间和时间。并且由于内存分配给线程堆栈,因此将经常执行内存交换算法,并且浪费了许多CPU时间电影。
可以将Coroutine理解为线程中运行的子线程。它的默认堆栈空间很小(例如Go的Coroutine堆栈为2KB)。当一个线程在一个线程上运行多个Coroutines时,Coroutine正在运行,将切换Coroutine操作,并且Coroutine的切换在用户的状态下完全完成,并且该计时器由程序员从行程中安排,从行程中,这将极大地改进线程的并发。
但是,Coroutine仅适用于IO密集型程序(大多数时间都在等待)。为了计算密集的过程,Coroutine的优势不是很好,因为CPU在大多数情况下都在不转换它的情况下工作。
由异步关键字定义的函数是异步函数,异步函数的实例是未来
注意:我在这里说的是异步功能的实例。您可能会理解异步功能的呼吁,但我认为这是不合理的,因为由于此“呼叫”,这种coroutine不会开始执行。
等待遵循代理商阻止当前的Coroutine,然后切换到此新的Coroutine进行执行
您可以将等待作为启动Coroutine的一种方式,与普通函数调用的效果相同
异步DEF FN2():print(“ FN2”)
异步def fn1():print(“ start fn1”)等待fn2()print(“ end fn1”)
异步def main():print(“ start main”)等待fn2()等待fn1()print(“ end main”)
启动主FN2开始FN1 FN2 END FN1 END MAIN
注意:python3.7并且不再使用事件的事件周期,而是使用asyncio.run(),但本质上是相同的。
例如,在现实生活中的一个例子,单击“外卖”,然后玩游戏,等待外卖发送它,如何使用Coroutine来实现这种情况?
有人可以在这里问,为什么要使用asyncio.sleep而不是时间。因为,在等待的背后的未来(异步功能的实例化对象),但是时间。Sleep不是异步功能,因此,如果您不支持Coroutines之间的切换,则不能实现并发,只有序列化
async def play_game():“”““玩游戏”“” print('start play_game')等待asyncio.sleep(1)print(1)print(“ play_game ...”)等待asyncio.sleep.sleep(1)print(“ play_game)(“ play_game)...”)等待Asyncio.sleep(1)print('end play_game')返回“游戏gg”
async def dian_wai_mai():“”“”“”“”“”“”“”“ dian_wai_mai”)等待asyncio.sleep(1)print(1)print(“ wai_mai in the feed ...”)等待asyncio.sleep(1)printon ...”)等待asyncio.sleep(1)prop(“ wai_mai到达”)返回”
异步def main():print(“ start main”)future1 = dian_wai_mai()fune2 = play_game()ret1 =等待future1 ret2 =等待future2 print(ret1,“ en en en en ond main”)
如果名称=='main':t1 = time.time()loop = asyncio.get_event_loop()loop.run_until_complete(main(main())
再次查看此执行的结果:
好的,这次满足了我们的期望。
原始:https://juejin.cn/post/7095400034165850148