我正在使用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()似乎没有削减它。我似乎没有任何其他线程阻止解释器死亡。 (除非我弄错了?)还有什么可以阻止程序退出?