Python-asyncio - using timers/threading to terminate async

Solution 1:

Following that, how can I use a timer to end the script?

You can call asyncio.run_coroutine_threadsafe() to submit a coroutine to an event loop running in another thread:

    if args.timeout:
        print("Timer started")
        timer = threading.Timer(
            args.timeout,
            asyncio.run_coroutine_threadsafe,
            args=(client.close(), loop),
        )
        timer.start()

Note, however, that since you're working with asyncio, you don't need a dedicated thread for the timer, you could just create a coroutine and tell it to wait before doing something:

    if args.timeout:
        print("Timer started")
        async def close_after_timeout(): 
            await asyncio.sleep(args.timeout)
            await client.close()
        loop.create_task(close_after_timeout())