Python program does not exit exception using aiozmq

I am using aiozmq for a simple RPC program. I created a client and server. When the server is running, the client is working fine. I have a timeout set in the client to throw an exception if the server is unavailable.

Customer Code below. When I start it without starting the server, I get the expected exception, but the script does not actually return to the terminal. He seems to be doing it all the same.

Can someone first explain how this happens, and secondly, how to fix it?

import asyncio
from asyncio import TimeoutError
from aiozmq import rpc
import sys
import os
import signal
import threading
import sys
import traceback
#signal.signal(signal.SIGINT, signal.SIG_DFL)


async def client():
    print("waiting for connection..")
    client = await rpc.connect_rpc(
        connect='tcp://127.0.0.1:5555',
        timeout=1
        )
    print("got client")

    for i in range(100):
        print("{}: calling simple_add".format(i))
        ret = await client.call.simple_add(1, 2)
        assert 3 == ret
    print("calling slow_add")
    ret = await client.call.slow_add(3, 5)
    assert 8 == ret

    client.close()

if __name__ == '__main__':

    loop = asyncio.get_event_loop()
    loop.set_debug(True)
    future = asyncio.ensure_future(client())
    try:
        loop.run_until_complete(future)
    except TimeoutError:
        print("Timeout occurred...")
        future.cancel()
        loop.stop()
        #loop.run_forever()
        main_thread = threading.currentThread()
        for t in threading.enumerate():
            if t is main_thread:
                print("skipping main_thread...")
                continue
            print("Thread is alive? {}".format({True:'yes',
                False:'no'}[t.is_alive()]))
            print("Waiting for thread...{}".format(t.getName()))
            t.join()

        print(sys._current_frames())
        traceback.print_stack()
        for thread_id, frame in sys._current_frames().items():
            name = thread_id
            for thread in threading.enumerate():
                if thread.ident == thread_id:
                    name = thread.name
            traceback.print_stack(frame)
        print("exiting..")
        sys.exit(1)
        #os._exit(1)
    print("eh?")

Below is the result of the above. Note again that the program is still working, I had to exit.

> python client.py
waiting for connection..
got client
0: calling simple_add
Timeout occurred...
skipping main_thread...
{24804: <frame object at 0x00000000027C3848>}
  File "client.py", line 54, in <module>
    traceback.print_stack()
  File "client.py", line 60, in <module>
    traceback.print_stack(frame)
exiting..
^C

I also tried sys.exit (), which also did not work:

try:
    loop.run_until_complete(future)
except:
    print("exiting..")
    sys.exit(1)

, os._exit (1). sys.exit(), , . , , . ( ?) ?

+4

Source: https://habr.com/ru/post/1650167/


All Articles