LoginSignup
8
6

More than 5 years have passed since last update.

Nim非同期I/Oを使う

Last updated at Posted at 2017-12-20

初めまして。
今回初めてAdventCalenderを書くにあたって、この辺から適当にサンプル引っ張って来ます。

Nim/tests/async

動作環境

  • Ubuntu 17.10
  • Nim 0.17.2

Module asyncfile

普通のファイル読み込みです。

readfile.nim
import asyncfile, asyncdispatch, os

const log = "/var/log/mylog"

proc main() {.async.} =
  let file = openAsync(log, fmRead)
  let data = await file.readAll()
  echo data
  file.close()

waitFor main()
nim c --hints:off -r readfile.nim

FutureStreamを使う場合です。
ただし、ファイル終端に達した時点で終了する模様で、追加されたのを検知できなようです。
FutureStreamの定義がどこにあるのかわからず

fsstream.nim
import asyncfile, asyncdispatch, os

const log = "/var/log/mylog"

proc main() {.async.} =
  var fs = newFutureStream[string]()
  let file = openAsync(log, fmRead)
  discard file.readToStream(fs)

  while not fs.finished:
    let (hasValue, value) = await fs.read()
    if hasValue:
      echo(value)

  file.close()
waitFor main()

AsyncSocketの使い方です。

AsyncNet

socket.nim
import asyncnet, asyncdispatch, streams, os, net

proc processClient(client: AsyncSocket) {.async.} =
  while true:
    let line = await client.recvLine()
    if line == "" or line == "\r\n":
      break

    echo line

proc serve() {.async.} =
  var server = newAsyncSocket()
  server.setSockOpt(OptReuseAddr, true)
  server.bindAddr(Port(8080))
  server.listen()

  while true:
    let client = await server.accept()
    asyncCheck processClient(client)

asyncCheck serve()
runForever()

以上です。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6