pub struct PyApp {
    pub handlers: PyHandlers,
    pub context: Option<Arc<PyObject>>,
    pub workers: Mutex<Vec<PyObject>>,
    pub router: Option<PyRouter>,
}
Expand description

Python application definition, holding the handlers map, the optional Python context object, the list of workers and the PyRouter.

Fields

handlers: PyHandlerscontext: Option<Arc<PyObject>>workers: Mutex<Vec<PyObject>>router: Option<PyRouter>

Implementations

Register a new context object inside the Rust state.

Start a single worker with its own Tokio and Python async runtime and provided shared socket.

Python asynchronous loop needs to be started and handled during the lifetime of the process. First of all we install uvloop as the main Python event loop. Thanks to libuv, uvloop performs ~20% better than Python standard event loop in most benchmarks, while being 100% compatible. We retrieve the Python context object, if setup by the user calling PyApp::context method, generate the PyState structure and build the aws_smithy_http_server::Router, filling it with the functions generated by PythonServerOperationHandlerGenerator.kt. At last we get a cloned reference to the underlying socket2::Socket.

Now that all the setup is done, we can start the two runtimes and run the hyper server. We spawn a thread with a new tokio::runtime, setup the middlewares and finally block the thread on hyper::serve. The main process continues and at the end it is blocked on Python loop.run_forever().

Register a new operation in the handlers map.

The operation registered in the map are used inside the code-generated router() method and passed to the aws_smithy_http_server::Router as part of the operation handlers call.

Main entrypoint: start the server on multiple workers.

The multiprocessing server is achieved using the ability of a Python interpreter to clone and start itself as a new process. The shared sockets is created and Using the multiprocessing::Process module, multiple workers with the method self.start_worker() as target are started.

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Returns the “default value” for a type. Read more

Performs the conversion.

Specify this class has #[pyclass(dict)] or not.

Specify this class has #[pyclass(weakref)] or not.

The closest native ancestor. This is PyAny by default, and when you declare #[pyclass(extends=PyDict)], it’s PyDict. Read more

Class doc string

#[pyclass(subclass)]

#[pyclass(extends=…)]

#[pyclass(mapping)]

Layout

Base class

This handles following two situations: Read more

Utility type to make Py::as_ref work.

Class name.

Module name, if any.

PyTypeObject instance for this type.

Checks if object is an instance of this type or a subclass of this type.

Checks if object is an instance of this type.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Extracts Self from the source PyObject.

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Returns the safe abstraction over the type object.

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more