在异步(和观察者模式)中链接协程

编程入门 行业动态 更新时间:2024-10-24 09:26:53
本文介绍了在异步(和观察者模式)中链接协程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我很难理解协程是如何链接在一起的。在一个比hello world或factorials稍微简单一点的示例中,我希望有一个循环,它持续监视文件修改时间,然后在每次接触文件时打印出时间:

#!/usr/bin/env python3 import os import asyncio @asyncio.coroutine def pathmonitor(path): modtime = os.path.getmtime(path) while True: new_time = os.path.getmtime(path) if new_time != modtime: modtime = new_time yield modtime yield from asyncio.sleep(1) @asyncio.coroutine def printer(): while True: modtime = yield from pathmonitor('/home/users/gnr/tempfile') print(modtime) loop = asyncio.get_event_loop() loop.run_until_complete(printer()) loop.run_forever()

我预计这会起作用-但是,当我运行它时,我得到一个:

RuntimeError: Task got bad yield: 1426449327.2590399

我在这里做错了什么?

更新:有关观察者模式的示例(即,在不使用回调(您必须使用任务)的情况下有效地允许多个注册者获取更新),请参阅下面的答案。

UPDATE2:对此有更好的修复:3.5的async for(异步迭代器):www.python/dev/peps/pep-0492/

推荐答案

我在链接的协程中使用return而不是yield使您的代码正常工作,就像chained coroutines example:

#!/usr/bin/env python3 import os import asyncio2 @asyncio.coroutine def pathmonitor(path): modtime = os.path.getmtime(path) while True: new_time = os.path.getmtime(path) if new_time != modtime: modtime = new_time return modtime yield from asyncio.sleep(1) @asyncio.coroutine def printer(): while True: modtime = yield from pathmonitor('/tmp/foo.txt') print(modtime) loop = asyncio.get_event_loop() loop.run_until_complete(printer()) loop.run_forever()

请注意,printer()的循环将为每个迭代创建一个新的pathmonitor生成器。不确定这是否是您想要的生成器,但这可能是一个开始。

我自己觉得协程API和语法有点混乱。以下是我觉得有帮助的一些读物:

  • What’s New In Python 3.3: "PEP 380: Syntax for Delegating to a Subgenerator"
  • PEP380: "Formal semantics"
  • asyncio: "Example: Chain coroutines"
  • Greg Ewing's "Binary Tree" example

更多推荐

在异步(和观察者模式)中链接协程

本文发布于:2023-11-23 10:03:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1621042.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:观察者   模式   链接

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!