Caution
Every payload you transmit with iceoryx2 must be compatible with shared memory. Specifically, it must:
- be self contained, no heap, no pointers to external sources
- have a uniform memory representation, ensuring that shared structs have the
same data layout
- therefore, only
ctypesandctypes.Structurecan be transferred
- therefore, only
- not use pointers to manage their internal structure
Any other python data type, except ctypes or ctypes.Structures, like will
cause undefined behavior and may result in segmentation faults. Take a look
at the publish subscribe example to see how ctypes
can be transferred.
This example demonstrates the request-response messaging pattern between two
separate processes using iceoryx2. A key feature of request-response in
iceoryx2 is that the Client can receive a stream of responses instead of
being limited to just one.
The Client uses the following approach:
- Sends first request by using the slower copy API and then enters a loop.
- Inside the loop: Loans memory and acquires a
RequestMut. - Writes the payload into the
RequestMut. - Sends the
RequestMutto theServerand receives aPendingResponseobject. ThePendingResponsecan be used to:- Receive
Responses for this specificRequestMut. - Signal the
Serverthat theClientis no longer interested in data by going out of scope. - Check whether the corresponding
ActiveRequeston theServerside is still connected.
- Receive
The Server uses the following approach:
- Receives the
RequestMutsent by theClientand obtains anActiveRequestobject. - The
ActiveRequestcan be used to:- Read the payload, header, and user header.
- Loan memory for a
ResponseMut. - Signal the
Clientthat it is no longer sending responses by going out of scope. - Check whether the corresponding
PendingResponseon theClientside is still connected.
- Sends one
Responseby using the slower copy API. - Loans memory via the
ActiveRequestfor aResponseMutto send a response.
Sending multiple responses demonstrates the streaming API. The ActiveRequest
and the PendingResponse can call is_connected() to see if the corresponding
counterpart is still sending/receiving responses. As soon as the
ActiveRequest or PendingResponse went out-of-scope is_connected() will
return false.
In this example, both the client and server print the received and sent data to the console.
Before proceeding, a virtual environment with all dependencies needs to be created. You can find the detailed instructions in the Python Examples Readme.
poetry --project iceoryx2-ffi/python installThen, the iceoryx2 python bindings can be built and installed into the virtual environment:
poetry --project iceoryx2-ffi/python run maturin develop --manifest-path iceoryx2-ffi/python/Cargo.toml --target-dir target/ff/pythonTo observe the communication in action, open two terminals and execute the following commands:
poetry --project iceoryx2-ffi/python run python examples/python/request_response/server.pypoetry --project iceoryx2-ffi/python run python examples/python/request_response/client.pyFeel free to run multiple instances of the client or server processes simultaneously to explore how iceoryx2 handles request-response communication efficiently.
Tip
You may hit the maximum supported number of ports when too many client or server processes run. Take a look at the iceoryx2 config to set the limits globally or at the API of the Service builder to set them for a single service.