【问题标题】:How to async read from a file in Nim?如何从 Nim 中的文件异步读取?
【发布时间】:2018-11-02 01:55:10
【问题描述】:

我正在关注 Nim in Action 一书。

在第 3 章中,有一个这样的例子:

import asyncdispatch, asyncfile

proc readFiles() {.async.} =
    var file = openAsync("/tmp/hello.py", fmReadWrite)
    let data = await file.readAll()
    echo(data)
    await file.write("Hello!\n")
    file.close()

waitFor readFiles()

我对该示例所做的唯一更改是将文件名替换为我系统上存在的文件名。

该代码应该输出打开文件的内容并写入“Hello!\n”。

但是当我运行它时,readAll 总是返回一个空字符串,我通过添加 assert len(data) > 0 进行了验证。

我可以改变什么来成功进行异步读取?

编辑

我的nim编译器的版本是:

$ nim --version
Nim Compiler Version 0.19.0 [MacOSX: amd64]
Compiled at 2018-09-28
Copyright (c) 2006-2018 by Andreas Rumpf

active boot switches: -d:release -d:useLinenoise

【问题讨论】:

    标签: nim-lang


    【解决方案1】:

    所以。问题是你假设echo(data) 应该打印一些东西。即使您一开始就将数据放入此文件中,它也不会打印任何内容,因为根据fmReadWrite 选项的documentation

    如果文件不存在,它将被创建。现有文件将被清除!

    浏览这段代码,即使是异步的,它也是这样的:

    1. 打开文件(文件为空 b/c fmReadWrite)
    2. 读取文件
    3. 打印您读取的数据
    4. 将 hello\n 写入文件
    5. 关闭文件

    有意义吗?

    以下代码,直接取自documentation ...

    import asyncfile, asyncdispatch, os
    
    proc main() {.async.} =
      var file = openAsync(getTempDir() / "foobar.txt", fmReadWrite)
      await file.write("test")
      file.setFilePos(0)
      let data = await file.readAll()
      doAssert data == "test"
      file.close()
    
    waitFor main()
    

    ... 完全符合您的要求。几乎和书上的教程一模一样。请注意 file.setFilePos(0) 调用以在写入数据后将文件指针重置到开头。

    另外应该注意的是,在阅读了你所指的书中的这个确切部分之后,作者并没有说这应该打印出任何东西。他们只是说

    显示文件的内容。

    我同意,这有点误导。我相信本教程的重点是向您展示执行异步 I/O 是多么容易。尽管教程中提供的示例代码不会打印任何内容,但会为您留下一个包含hello\n 的文件。

    也许一个更好的例子是在运行代码之前创建您想要读取的文件,然后将标志更改为fmReadWriteExisting,这样您就可以打印一些东西了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多