type TMsgKind = enum mLine, mEof TMsg = object {.pure, final.} case k: TMsgKind of mEof: backTo: TThreadId[int] of mLine: data: string var consumer: TThread[TMsg] printedLines = 0 proc consume() {.thread.} = while true: var x = recv[TMsg]() if x.k == mEof: x.backTo.send(printedLines) break echo x.data discard atomicInc(printedLines) proc produce() = var m: TMsg var input = open("readme.txt") while not endOfFile(input): if consumer.ready: m.data = input.readLine() consumer.send(m) close(input) m.k = mEof m.backTo = mainThreadId[int]() consumer.send(m) var result = recv[int]() echo result createThread(consumer, consume) produce() joinThread(consumer) echo printedLines