Я думал, что процессы Python называют их функции atexit, когда они завершаются. Обратите внимание, что я использую Python 2.7. Вот простой пример:Процесс Python, который соединен, не будет вызывать atexit
from __future__ import print_function
import atexit
from multiprocessing import Process
def test():
atexit.register(lambda: print("atexit function ran"))
process = Process(target=test)
process.start()
process.join()
Я ожидаю, что это напечатает функцию atexit ran, но это не так.
Обратите внимание, что этот вопрос: Python process won't call atexit похож, но включает в себя процессы, которые завершаются с сигналом, и ответ предполагает перехват этого сигнала. Процессы в этом вопросе выходят изящно, поэтому (насколько я могу судить, так или иначе), что вопрос & ответ не применяется (если только эти Процессы не выходят из-за сигнала каким-то образом?).
@MichaelBrennan этот вопрос включает в себя процессы, которые заканчиваются сигналом. Мои процессы просто изящно выходят из строя, так что это не дубликат (исправление, размещенное там, не применимо здесь, насколько я могу судить, если только мои тоже не будут убиты сигналом) – nonagon
Вы правы, так или иначе Я делаю вывод, что сигнал используется даже без 'terminate()'. Я удалил комментарий дублирования. Возможно, вы можете настроить обработчик сигналов и попытаться выяснить, есть ли какие-либо сигналы? –
Код выхода (то есть process.exitcode, оцененный после выполнения соединения) равен нулю, насколько я могу судить. Если я завершаю процесс, я получаю отрицательный код выхода, как ожидалось из документов. Так что я довольно смущен! Я не могу представить, что это фундаментальное явление нарушено, но я не могу найти доказательств в любом месте, что это не должно работать, как я ожидаю. – nonagon