Python-SimConnect icon indicating copy to clipboard operation
Python-SimConnect copied to clipboard

Use asyncio with sync wrapper, stay compatible

Open Koseng opened this issue 4 years ago • 1 comments

Moved to asyncio, including a sync wrapper. So everything should be compatible. Introduced async_get(...) next to get(...).

To call async functions, an event loop is necessary. This is provided by the helper thread in AsyncLoop. With that helper, a sync wrapper can be put on top of the async implementation.

Please test.

I also tried tried an implementation with asyncio Futures to replace the wait and sleep pattern. It is the asyncio way to wait for a callback. But it turned out to be much slower in the sync case, so I returned to the current implementation.

Koseng avatar Jun 03 '21 11:06 Koseng

Example async client test code:

import asyncio
from SimConnect import AircraftRequests, SimConnect

async def main():
        sm = SimConnect()
        aq = AircraftRequests(sm)
        while True:
            results = await asyncio.gather(
                        aq.async_get("RUDDER_DEFLECTION"),
                        aq.async_get("AMBIENT_PRESSURE"),
                        aq.async_get('RADIO_HEIGHT'),
                        aq.async_get("GROUND_ALTITUDE"),
                        aq.async_get("RUDDER_DEFLECTION"),
                        aq.async_get("AMBIENT_PRESSURE"),
                        aq.async_get('RADIO_HEIGHT'),
                        aq.PositionandSpeedData.async_get('PLANE_LATITUDE'),
                        aq.PositionandSpeedData.async_get('PLANE_LONGITUDE'),
                        aq.PositionandSpeedData.async_get('PLANE_ALTITUDE'),
                        aq.FlightInstrumentationData.async_get('KOHLSMAN_SETTING_HG'))
            print(results)
            await asyncio.sleep(0.3)

asyncio.run(main())

Koseng avatar Jun 04 '21 08:06 Koseng