micropython的轻量级类异步库,围绕本机python协同路由构建。

micropython-uasyncio的Python项目详细描述


uasycio是一个最小异步调度库,大致上 模仿了cpython的异步。uasyncio用于 Pycopy,高级叉子 微蟒。

uasyncio不使用naive always迭代调度算法, 但是执行基于实时的调度,这允许它(和 因此整个系统)在无事可做的情况下睡觉(实际上 它的实现依赖于i/o调度算法 实际执行等待操作)。

异步的主要概念差异:

  • 避免定义未来的概念,尤其是包装协程 在未来,就像cpython asyncio一样。uasyncio直接与 协同程序(和回调)。
  • 提供的方法是更一致的协程。
  • uasyncio使用环绕毫秒时基(作为所有 micropython端口。)
  • 不提供单个大包装,而是提供子包装的数量 (每个都可以单独安装)。

具体区别:

  • 对于毫秒调度,loop.call_later_ms()uasyncio.sleep_ms()已提供。
  • 由于没有单调时间,因此不提供loop.call_at()。 取而代之的是loop.call_at_(),它被认为是内部的 函数和具有稍微不同的签名。
  • call_*函数不返回由调度的句柄和回调 它们不能取消。如果需要取消,它们应该 接受对象作为参数,并应设置“取消”标志 在对象中,用于测试回调。
  • Future对象不可用。
  • ensure_future()Task()只执行调度操作 并返回本机协同程序,而不是未来/任务对象。
  • 其他一些功能尚未实现。
  • streamwriter方法是协同程序。在cpython asyncio中, streamwriter.write()是一个普通函数(可能会缓冲 无限制的数据量),uasyncio提供了coroutine streamwriter.awrite() 相反。此外,streamreader和streamwriter都有.aclose() 协同程序方法。

要求

在编写本文时,uasyncio需要Pycopy 要运行的项目。

高级主题

术语:

  • 任务-顶级协同程序,在事件循环中使用其 创建任务()方法。(或者,作为uasyncio扩展,一个coutroutine 对象由另一个协程传递给“yield”语句,此 相当于create_task()调用)。运行不同的任务 以合作的方式同时进行。每个任务也可以调用 递归地另一个协程(在这种情况下调用协程 将“等待”(字面意思)完成所谓的联程。更多 在形式上,任务是在顶层路由的协同调用树 传递给create_tast(),并由其标识的协程。

任务间资源共享注意事项

就像在抢占线程之间共享资源一样,共享资源 uasyncio之间的协作任务有其特殊性和局限性。 实际上,由于I/O调度的实现,还有 要考虑的特点。但是让我们从陈述资源开始 任务/线程之间的共享通常是一个错误。例如,如果两者都是 任务写入资源时,它们可能会穿插在 不可预知的方式。阅读更成问题:不同的任务 可能得到部分输入,或者一个可以得到全部,而另一个则完全没有。if任务 实现一些协议,即I/O对话框,这将导致不正确的 行为和/或死锁。因此,规则是:不要共享相同的I/O 对象,特别是streamreader和streamwriter对象 不同的任务。(当然,它们可以传递给 当前任务)。

上面的一个极端情况是试图使用相同的reader部分 一个任务中的streamreader/streamwriter部分,而另一个任务中的writer部分。 这可能只是推测性使用,也不支持: 流读取器And streamwriter表示相同的半双工部分 I/O流,两者都必须在一个任务中使用。如果你需要什么 像上面一样,您需要创建不同的streamreader/writer对 (可能来自不同的底层I/O对象)。

虽然上面给出了streamreader/streamwriter示例,但它适用于 其他I/O对象。例如,uasyncio.udp套接字 不应将相同内容传递给两个不同的任务。如果你需要这个,2 应使用不同的插座。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将特定于语言环境的字符串转换为BigDecimal的最佳方法   java生成的数字在下降的水平上增加   java如何验证列表中的元素是否按字母顺序排序   java无法使用Jintellitype包com。梅洛器皿   java Hibernate显示来自JComboBox的记录   java更改模拟器屏幕分辨率?   java如何从可移动/辅助SD卡中删除文件   java检查在MySQL中插入时数据库中是否存在给定的用户名   java如何替换线程。无限循环中的sleep()?   java如何从数据库中获取一列的字符串数据作为数组数据   将内容存储在缓冲区中的java   java ControllerAdvice不处理引发的异常   Java Maven问题   java NullPointerException试图从方法返回2D对象数组时   这个简单的Java代码有什么问题?   java如何删除或访问pom文件中插件的构建时间戳   java销售收据,多选(if/else),while循环,客户更改选择的能力   Java:基于字符串的加载类方法   java OrientDB服务器部分忽略OrientDB_HOME