Resource Management
Yona provides a specialized infrastructure for managing resources, including their initialization and finalization, with guaranteed ordering and error handling.
This feature is called context managers and it allows for generic, extensible management of local contexts. Context managers are used in conjunction with the with
expression.
Context Managers¶
Context managers provide the necessary gear for dealing with resource management is a structured way, that can be used together with the with
expression. They provide a way for Yona to initialize and finalize resources. Resources may be explicitly or implicitly named direct access within the scope of the with
expression.
Module context\Local
provides functions for implementing custom context managers. Builtin modules, such as STM or File implement context managers as well.
Context managers store their data in a local dictionary, so that they can be used from any threads (this is transparent for programmers, who need not to be aware of this actually).
Context manager is a triple of (name, wrapper, data)
, where:
name
is the default name of the alias, used as a key in the local context dictionary.wrapper
wrapper is a 2-arg function - taking the context manager tuple and a callback that is called from within this wrapper function and of which result is returned as a result of this wrapper. The wrapper can perform initialization and finalization of resources around calling the callback.data
is the actual data, such as transaction object, file object or whatever other resource data to be managed by the context manager.
Lifecycle of Context Managers¶
Context manager is executed in this order:
- the context manager tuple is stored to the local context dictionary
- the
wrapper
function is executed, expected to initialize necessary resources, then call the callback passed into this function and finally resources get disposed after they've been used - if body expression raises an exception, the
leave
function is still called regardless
Handling errors¶
Whether an exception is raised or not within the context manager execution is not important for its lifecycle. Context managers ensure that proper initialization and finalization of resources always takes place and for this reason they are the recommended way for handling this sort of thing
Daemon Context Management¶
Context managers provide means to manage resources in a consistent and safe way. Just like any other constructions in Yona, the with
expression produces a return value, that of its body. Sometimes it may be desired not to await this result but still take advantage of the automatic resource management provided by the with
expression. This is typically the case when the context manager is provided per connection. In this case the calling expression would be limited to handling only one connection at a time.
In these situations it is useful to move the body expression processing to the background and "forget" about it. This can be achieved by putting a daemon
keyword after the with
keyword. For more information about the syntax, see the syntax guide for the with
expression.
The result of the with daemon
expression is therefore ()
, resources will be properly released once the body expression evaluation finishes, nevertheless.