python程序没有使用aiozmq退出异常

时间:2016-08-04 12:15:13

标签: python-3.x python-asyncio

我正在使用aiozmq进行简单的RPC程序。 我创建了一个客户端和服务器。 当服务器运行时,客户端运行正常。 我在客户端设置了超时,以便在没有服务器可访问的情况下引发异常。

客户端代码如下。当我在没有运行服务器的情况下运行它时,我得到一个预期的异常,但脚本实际上并没有返回到终端。它似乎仍然在执行。

有人可以先解释一下这是怎么回事吗?其次是如何解决这个问题?

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?")

运行以上操作的结果如下。再次注意该程序仍在运行,我不得不退出。

> 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

我也尝试了sys.exit(),但也没用:

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

我可以让程序死掉,但前提是我使用os._exit(1)。 sys.exit()似乎没有削减它。我似乎没有任何其他线程阻止解释器死亡。 (除非我弄错了?)还有什么可以阻止程序退出?

0 个答案:

没有答案