教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 协程与异步IO

协程与异步IO

发布时间:2023-03-09   编辑:jiaochengji.com
教程集为您提供协程与异步IO等资源,欢迎您收藏本站,我们将为您提供最新的协程与异步IO资源

协程,又称微线程,纤程。英文名Coroutine。Python对协程的支持是通过generator实现的。在generator中,我们不但可以通过for循环来迭代,还可以不断调用next()函数获取由yield语句返回的下一个值。但是Python的yield不但可以返回一个值,它还可以接收调用者发出的参数。yield其实是终端当前的函数,返回给调用方。python3中使用yield来实现range,节省内存,提高性能,懒加载的模式。

asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。


从Python 3.5开始引入了新的语法asyncawait,用来简化yield的语法:

import asyncio

import threading

async def compute(x, y):

    print("Compute %s %s ..." % (x, y))

    print(threading.current_thread().name)

    await asyncio.sleep(x y)

    return x y

async def print_sum(x, y):

    result = await compute(x, y)

    print("%s %s = %s" % (x, y, result))

    print(threading.current_thread().name)

if __name__ == "__main__":

    loop = asyncio.get_event_loop()

    tasks = [print_sum(1, 2), print_sum(3, 4)]

    loop.run_until_complete(asyncio.wait(tasks))

    loop.close()

线程是内核进行抢占式的调度的,这样就确保了每个线程都有执行的机会。而 coroutine 运行在同一个线程中,由语言的运行时中的 EventLoop(事件循环)来进行调度。和大多数语言一样,在 Python 中,协程的调度是非抢占式的,也就是说一个协程必须主动让出执行机会,其他协程才有机会运行。

让出执行的关键字就是 await。也就是说一个协程如果阻塞了,持续不让出 CPU,那么整个线程就卡住了,没有任何并发。

PS: 作为服务端,event loop最核心的就是IO多路复用技术,所有来自客户端的请求都由IO多路复用函数来处理;作为客户端,event loop的核心在于利用Future对象延迟执行,并使用send函数激发协程,挂起,等待服务端处理完成返回后再调用CallBack函数继续下面的流程


Go语言的协程是语言本身特性,erlang和golang都是采用了CSP(Communicating Sequential Processes)模式(Python中的协程是eventloop模型),但是erlang是基于进程的消息通信,go是基于goroutine和channel的通信。

Python和Go都引入了消息调度系统模型,来避免锁的影响和进程/线程开销大的问题。

协程从本质上来说是一种用户态的线程,不需要系统来执行抢占式调度,而是在语言层面实现线程的调度。因为协程不再使用共享内存/数据,而是使用通信来共享内存/锁,因为在一个超级大系统里具有无数的锁,共享变量等等会使得整个系统变得无比的臃肿,而通过消息机制来交流,可以使得每个并发的单元都成为一个独立的个体,拥有自己的变量,单元之间变量并不共享,对于单元的输入输出只有消息。开发者只需要关心在一个并发单元的输入与输出的影响,而不需要再考虑类似于修改共享内存/数据对其它程序的影响。


有疑问加站长微信联系(非本文作者)

到此这篇关于“协程与异步IO”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
在python中线程和协程的区别是什么
浅谈Go语言的Goroutine和协程
golang的协程原理
Golang协程原理(一)
Go语言潜力有目共睹,但它的Goroutine机制底层原理你了解吗?
go 协程
swoole基础概念
php使用swoole为什么会快
详解Python中的协程
python3爬虫进阶:异步协程的使用

上一篇:Go语言slice切片详解 下一篇:go语言特点
[关闭]
~ ~