The AbletonOSC Python client uses a threading.Event to block on an OSC reply, creating a synchronous query interface
AbletonOSC’s client/client.py provides an AbletonOSCClient class that wraps the async OSC receive loop (in a daemon thread) with a synchronous query() method. It registers a one-shot handler for the reply address, sends the request, and blocks on a threading.Event.wait(timeout). When the reply arrives in the receive thread, the handler sets the event and stores the params; the calling thread unblocks and returns the result. If no reply arrives within the timeout (default TICK_DURATION), it raises RuntimeError. This pattern is the standard way to make async UDP message-exchange look like a synchronous function call. The daemon thread ensures the receive server shuts down when the main program exits.
Examples
tempo = client.query(‘/live/song/get/tempo’) # blocks until reply or timeout; returns a tuple. client.send_message(‘/live/song/set/tempo’, [140.0]) # fire and forget.
Assessment
Explain why a threading.Event is used rather than a simple sleep in AbletonOSCClient.query(). What happens if the AbletonOSC server does not reply within the timeout? What makes the server thread a daemon thread, and why does that matter?