【问题标题】:Python: How to make the function run unconditionally when the program ends?Python:如何让函数在程序结束时无条件运行?
【发布时间】:2021-10-03 17:38:02
【问题描述】:

我必须确保 end_event() 函数在程序结束时执行。我试图将其实现为 Python 的 atexit。但是,当使用 PyInstaller 将 .py 文件转换为 exe 文件并单击关闭时,它不起作用。如果您能告诉我一个始终有效的解决方案,我将不胜感激。祝你有美好的一天。

import atexit
import signal
import pyupbit

def end_event():
    for keys in buy_list.keys():
        order = upbit.get_order(keys)
        if "state" in order:
            if(order['state'] == 'wait'):
                upbit.cancel_order(keys)
    exit(1)

atexit.register(end_event)
signal.signal(signal.SIGINT, end_event)

【问题讨论】:

  • “点击关闭”——如果它通过对默认操作系统行为的处理,这实际上是 Windows 中的 KILL -9。
  • 那么,这种情况下是不是没有办法在Python代码上实现呢? (哭……)
  • 用一个小的 PyTK 包装器打包它(然后你就可以控制 UI 方面了..)?
  • 启动独立(两部分)进程?那么当“客户端”(即windows终端的子进程)死掉时,“服务器”可以干净地关闭吗?
  • 有趣!我也试试这个方法。谢谢你的回答!

标签: python events exit atexit


【解决方案1】:

无法保证进程退出时代码会运行,因为有一些退出方式不允许任何代码运行。

  • 用户可以拉电源线。没有代码可以运行,因为没有电源。
  • 外部事件(断电、雷击),同上。
  • Kill -9 或等效项,例如Windows'TerminateProcess

紧急清理模式。

最好的模式是:永远不要处于需要紧急清理的状态。

  • 无法保证您的清理工作会运行,因为您可能会遇到 kill -9 或断电。
  • 因此,您需要能够在这种情况下恢复。

另请参阅:What does the POSIX standard say about thread stacks in atexit() handlers? What's the OS practice?

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多