Skip to content

yglukhov/yasync

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

72 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

yasync - Yet another async/await for Nim

Build Status nimble

Requires nim devel or 2.0.

  • Semantics is very close to that of Nim's std async, await and Future[T].
  • await operation doesn't cause any heap allocations (except async closures, and (mutually) recursive async calls).
  • callSoon is not used and async code is guaranteed to run atomically between awaits across call boundaries (TODO: maybe add an example)
  • Function return type is written as T, then async transforms it to Future[T] implicitly.
  • Supports cancellation of async tasks, with optional cancellation callbacks in terminal futures. Example.
  • Provides optional compatibility layer for interop with existing asyncdispatch and chronos code. Example. The library itself is completely dispatcher agnostic, and doesn't depend on neither asyncdispatch, nor chronos.

This library introduces async, await and Future[T] similar in semantics to Nim's native ones, but implements an optimization to avoid heap allocations. Consider the following sample:

proc sleep(ms: int): Future[void] = ... # Let's assume this function doesn't allocate

proc foo(a: int): int {.async.} =
  await sleep(a)
  var b = a + 1
  return b

proc bar() {.async.} =
  let a = await foo(5)
  let b = await foo(6)
  echo a + b

waitFor bar()

If we pretend that sleep doesn't allocate, the whole waitFor operation above will not do a single allocation. The optimization happens in async functions on await calls.

TODO: Describe how it works in details

TODO:

  • Nice stack traces

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages