我目前正在将一个Python项目从Linux移植到Windows(使用Anaconda Python 3.6).一切都很完美,我无法正常退出asyncio循环工作.
在Linux中我正在做以下事情:
class GracefulExit(SystemExit):
code = 1
def raise_graceful_exit():
raise GracefulExit()
loop = asyncio.get_event_loop()
loop.add_signal_handler(signal.SIGINT, raise_graceful_exit)
loop.add_signal_handler(signal.SIGTERM, raise_graceful_exit)
try:
loop.run_forever()
except GracefulExit:
pass
shutdown()
Run Code Online (Sandbox Code Playgroud)
在Windows中,不幸的是我得到NotImplementedError的add_signal_handler.如果没有这个,我当然永远不会有机会彻底关闭程序.
关于如何解决这个问题的任何想法?谢谢.
实际上你可以在 python 脚本中实现一种跨平台的 python 信号处理程序,它可以在 Unix/Linux 和 Windows 上运行,python 有一个标准信号库,所以你可以做这样的事情
import asyncio
import signal
class GracefulExit(SystemExit):
code = 1
def raise_graceful_exit(*args):
loop.stop()
print("Gracefully shutdown")
raise GracefulExit()
def do_something():
while True:
pass
loop = asyncio.get_event_loop()
signal.signal(signal.SIGINT, raise_graceful_exit)
signal.signal(signal.SIGTERM, raise_graceful_exit)
try:
loop.run_forever(do_something())
except GracefulExit:
pass
finally:
loop.close()
Run Code Online (Sandbox Code Playgroud)
由于上述平台差异,它在 Windows 和 Linux 上的行为并不完全相同,但在大多数情况下,它在两个平台上都可以正常工作。
Windows 没有信号。
如果该进程通过 TerminateProcess API 被终止,您将没有任何机会进行清理(就像“kill -9”一样,会破坏您的进程)。
但是 windows 有两种方式来指示您的代码是否应该退出,一种用于控制台程序(例如 python.exe),另一种用于 gui 程序(pythonw.exe)。
Python 会自动处理控制台并引发 KeyboardInterrupt 异常,但您可以使用控制台控制处理程序 API(https://docs.microsoft.com/en-us/windows/console/console-control)将自己的代码挂接到该处理程序中-handlers),但这可能有点矫枉过正。只需在您的事件循环上设置一个适当的异常处理程序。
对于 GUI 进程,如果用户注销、系统进入省电模式等,Windows 会向您发送 Windows 消息,例如WM_QUIT或其他各种消息,您也可以借助 ctypes 或 win32 包或任何许多python gui库。
| 归档时间: |
|
| 查看次数: |
1722 次 |
| 最近记录: |