How can I implement asynchroneous code in mojo (using async
etc.)?
In the Changelog, I find the following example (slightly adjusted):
async fn add_three(a: Int, b: Int, c: Int) -> Int:
return a + b + c
async fn call_it():
var task = add_three(1, 2, 3)
print(await task)
This gives me the following compiler error:
test_async.mojo:39:17: error: 'Coroutine[Int, {}]' is not copyable because it has no '__copyinit__'
print(await task)
^~~~
I do not understand this error, as I thought that Coroutine
is register passable (as visible in the source code). What works is
async fn add_three(a: Int, b: Int, c: Int) -> Int:
return a + b + c
async fn call_it():
var task = await add_three(1, 2, 3)
print(task)
However, if I always put await
on the right hand side, I will never be able to execute code asynchroneously, as I am always waiting until the line has finished. What am I doing wrong / where is my misconception? (Or is this simply a bug?)
In the changelog it furthermore says that tasks can be “resumed” after completion (see here). What is meant by “resume” and how do I do that?
I am working on the current nightly built: mojo 2024.7.2005 (96a1562c).
Note: I have also posted this question on mojo’s Q&A page but have not seen any reaction so far. I will update this post if I recieve an answer there.