>
> This is incorrect. "Create an async bounded context playpen" (what I
called "async" in my example)
> and "start a fiber/thread/task" (what I called "spawn") are two
*separate* operations, and > must remain so.
>
>
So, you use *async* to denote the context and *spawn* to create a coroutine.

Regarding the context, it seems there's some confusion with this term.
Let's try to separate it somehow.

For coroutines to work, a *Scheduler* must be started. There can be only
one *Scheduler* per OS thread. That means creating a new async task *does
not* create a new *Scheduler*.

Apparently, *async {}* in the examples above is the entry point for the
*Scheduler*.

>
> This is probably not the ideal way to structure it in practice, but it
should get the point across.
>

Sounds like a perfect solution.

However, the initialization order raises some doubts: it seems that all
required coroutines must be created in advance. Will this be convenient?
What if a service doesn’t want to initialize a coroutine immediately? What
if it’s not loaded into memory right away? *Lazy load.*

For example, we have a *Logger* service, which usually starts a coroutine
for log flushing. Or even multiple coroutines (e.g., a timer as well). But
the service itself might not be initialized and could start only on first
use.

Should we forbid this practice?
If you want to be a service, should you *always* initialize yourself
upfront?

Wait a minute. This resembles how an OS works. At *level 0*, the operating
system runs, while user-level code interacts with it via *interrupts*.

It's almost the same as *opening a channel in the ROOT context* and sending
a message through the channel from some *child context*. Instead of sending
a message directly to the Logger, we could send it to the *service manager*
through a channel.

Since the *channel was opened in the ROOT context*, all operations would
also execute in the *ROOT context*. And if the LOGGER was not initialized,
it would be initialized *from the ROOT context*.
Possible drawbacks:

   1. It's unclear how complex this would be to implement.
   2. If messages are sent via a channel, the logger *won't be able to
   fetch additional data from the request environment*. All data must be
   explicitly passed, or the *entire context* must be thrown into the
   channel.

Needs more thought.

But in any case, the idea with the channel is good. It can cover many
scenarios.

Everything else is correct, I don’t have much to add.

---

Ed.

Reply via email to