我一直在关注《行动中的尼姆》。
在第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
答案 0 :(得分:1)
所以。问题是您假设echo(data)
应该打印某些内容。即使您将数据放入该文件中,它也永远不会打印任何内容,因为根据documentation中的fmReadWrite
选项:
如果文件不存在,将创建它。现有文件将被清除!
即使没有异步,也要遍历这段代码:
有道理吗?
以下代码直接取自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
,这样,您将可以打印一些内容。