【问题标题】:Python asyncio read file and execute another activity at intervalsPython asyncio 读取文件并每隔一段时间执行另一个活动
【发布时间】:2014-11-13 18:54:23
【问题描述】:

我承认我很懒惰:我需要很快地完成这项工作,并且无法理解 Python3 asyncio 模块。 (有趣的是,我发现 boost 相当直观。)

我需要读取一个不时阻塞的文件对象(管道)。在此期间,我希望能够以设定的时间间隔(比如每 30 分钟)触发另一个活动,而不管是否可以从文件中读取任何内容。

谁能帮我用一个骨架来使用 python3 asyncio 做到这一点? (无法安装twis​​ted等第三方模块。)

【问题讨论】:

  • 另一种可能不太复杂的选择是同步读取文件并通过threading.Timer在后台线程中完成其他工作。

标签: python python-asyncio


【解决方案1】:

asyncio(以及其他异步库,如 twisted 和 tornado)不支持文件的非阻塞 IO - 只有套接字和管道被异步处理。

主要原因是:Unix系统没有很好的文件处理方式。比如说,在 Linux 上,任何文件读取都会阻塞操作。

另见https://groups.google.com/forum/#!topic/python-tulip/MvpkQeetWZA

UPD。

对于安排定期活动,我想使用asyncio.Task

@asyncio.coroutine
def periodic(reader, delay):
    data = yield from reader.read_exactly(100)  # read 100 bytes
    yield from asyncio.sleep(delay)

task = asyncio.Task(reader, 30*60)

片段假定 readerasyncio.StreamReader 实例。

【讨论】:

  • 谢谢。我没有意识到这个区别。但事实上,正如我所说的,我正在阅读管道。
  • 为周期性跑步者添加了 sn-p。如果您对管道对象类型(如何创建/获取该对象)更加具体,我可以猜测更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 2022-12-08
  • 1970-01-01
相关资源
最近更新 更多