Как вы можете гарантировать, что зарегистрированная функция atexit будет работать с AppHelper.runEventLoop() в PyObjC?
Вопрос
Мне просто интересно, почему я зарегистрировал функцию atexit...например
import atexit
atexit.register(somefunc)
...
AppHelper.runEventLoop()
Конечно, я знаю, когда atexit
не сработает.Когда я комментирую AppHelper.runEventLoop()
тот atexit
функция вызывается.Я также просмотрел свой pyobjc
яйцо, и я увидел под __init__.py
под objc
упакуйте следующий код:
import atexit
atexit.register(recycleAutoreleasePool)
Я искал какие-либо ссылки внутри яйца, но безрезультатно.Я также попробовал окружить оболочку try-finally вокруг AppHelper.runEventLoop()
, и команды в блокеfinally не будут вызваны.
Надеюсь, кто-нибудь сможет мне помочь здесь.
P.S.Предполагая, что я не хочу использовать делегата приложения applicationShouldTerminate:
метод...
Решение
Я считаю, что вам нужны делегаты, потому что в противном случае цикл событий может довольно резко завершить процесс (что-то вроде os._exit
) и, следовательно, не давать среде выполнения Python возможности запуска кода завершения, такого как finally
положения, atexit
функции и т. д. и т. п.