Удостоверьтесь, что подпроцесс мертв в Какао

Общий путь
import sys
sys.stdout.write('.')

Вы, возможно, также должны звонить

sys.stdout.flush()

для обеспечения stdout, сразу сбрасывается.

Python 2.6 +

Из Python 2.6 можно импортировать эти print функция из Python 3:

from __future__ import print_function

Это позволяет Вам использовать решение Python 3 ниже.

Python 3

В Python 3, print оператор был изменен в функцию. В Python 3 можно вместо этого сделать:

print('.', end='')

Это также работает в Python 2, при условии, что Вы использовали from __future__ import print_function.

, Если Вы испытываете затруднения буферизовать, можно сбросить вывод путем добавления flush=True аргумент ключевого слова:

print('.', end='', flush=True)

Однако примечание, что flush ключевое слово не доступно в версии print функция, импортированная от [1 112] в Python 2; это только работает в Python 3, более конкретно 3.3 и позже. В более ранних версиях необходимо будет все еще сбросить вручную с вызовом к [1 113].

Источники

  1. https://docs.python.org/2/library/functions.html#print
  2. https://docs.python.org/2/library/__future__.html
  3. https://docs.python.org/3/library/functions.html#print
9
задан Francisco Ryan Tolmasky I 18 August 2009 в 08:33
поделиться

2 ответа

Ваш делегат приложения может реализовать сообщение

- (void)applicationWillTerminate:(NSNotification *)aNotification

и завершить NSTask там. Однако не гарантируется, что во время сбоя этот делегат будет вызван.

Два дополнительных шага, которые вы можете предпринять:

  • Завершение существующего потерянного подпроцесса во время запуска нового родительского процесса путем записи на диск PID подпроцесса при его создании и удалении во время нормального завершения работы (иногда это не самое безопасное поведение).
  • Завершите подпроцесс, если конечная точка NSPipe не отправляла данные в течение определенного времени (что-то вроде пульса) .
1
ответ дан 3 November 2019 в 07:48
поделиться

ОБНОВЛЕНИЕ: теперь, когда я пошел, чтобы проверить это как следует, это не работает. При попытке установить группу процессов возникает эта ошибка;

EPERM «Эффективный идентификатор пользователя запрошенного процесса отличается от идентификатора вызывающего процесса, и процесс не является потомком вызывающего процесса».

Существует более свежая ветка по этой проблеме, но, насколько я могу судить, нет простого решения

http://www.omnigroup.com/mailman/archive/macosx-dev/2009-March/062164. html


Я попробовал предложение Роберта Пойнтона о Cocoadev в своем приложении. Однако я еще не успел его протестировать.

http://www.cocoadev.com/index.pl?NSTaskTermination

Идея состоит в том, чтобы установить группу процессов задачи, которая должна быть такой же, как эта. процесса, запускающего задачу (примечание: приведенный ниже код в основном взят из потока выше).

    pid_t group = setsid();
    if (group == -1) {
        group = getpgrp();
    }

   [task launch]; 


if (setpgid([task processIdentifier], group) == -1) {
   NSLog(@"unable to put task into same group as self");
   [task terminate];
} else {
// handle running task
}
0
ответ дан 3 November 2019 в 07:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: