python 什么是异步通信

Python012

python 什么是异步通信,第1张

异步通信是一种很常用的通信方式。

相对于同步通信,异步通信在发送字符时,所发送的字符之间的时隙可以是任意的,当然,接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。内部处理器在完成了相应的操作后,通过一个回调的机制,以便通知发送端发送的字符已经得到了回复。

最重要的是生成器函数碰到yield停止执行,收到next或send才会继续执行的机制。

而且send方法令我们可以传递值到生成器暂停的地方。

生成器执行结束抛出 StopIteration 异常。

yield from用于把其他生成器当做子例程调用。

然后它可以被其他用 async def 定义的的协程函数B和C await ,只有当 await 返回时,B和C才继续执行。

这样我们就可以有效地控制B和C的执行顺序。

然后我们创建了一个调度器,它对列表进行了两次深拷贝以避免问题。它循环协程队列,使用 send 方法对每个协程依次递进,如果有协程已经完成则将其移出队列,当列表中的协程全部完成时结束。

然后通过 args=coro.send(None) 与该函数碰撞,得到含有 delay 参数的字典作为 send 的返回值。便可以判断出是否调用调度器的睡眠机制。

最后在调度器中实现每一次协程列表循环结束后判断在睡眠列表中的协程是否有到时间的,到时间或时间超出则添加到运行协程列表中进入循环执行。如果运行列表中的协程都执行完了,则查看睡眠列表中的协程中还需睡眠的最少时间,线程睡眠,睡眠完成再将其添加到运行队列。

该装饰器能将一个比较耗时的计算函数封装为一个协程,使其可以被其他协程 await 。在调度器中利用 send 函数的返回值可以获取它的类型为 background 、函数入口地址以及函数的传参,然后在调度器中按相应机制执行。

第二部分 是在调度器中的修改:我们让调度器类拥有了一个私有的 concurrent.futures.ThreadPoolExecutor() 对象。并在运行协程队列的循环判断中将 background 类型的操作提交给线程池对象,并将当前的协程移出运行队列,添加到 futures 队列中。然后在每次运行队列循环后判断 futures 中的任务是否有完成的(使用的参数为一旦有任一任务完成或被取消都返回),如果主线程此时处于将要睡眠的状态,就等待相应的时间,没有的话则立刻返回,下次再查询,完成的任务将其所在协程带入运行队列,任务结果通过调度器 send 传回该协程。