LINUX.ORG.RU

История изменений

Исправление AIv, (текущая версия) :

Имхо, нельзя два раза вызывать waitpid (и аналогичные функции) на один и тот же pid (ибо это одноразовый clean-up action).

Правда? Че то я в документации такого не нашел. Зато нашел вот такое

http://wm-help.net/lib/b/book/2075737573/186

" WNOHANG

Если ни один порожденный процесс не завершился, вернуться немедленно. Таким способом можно периодически проверять, не закончился ли какой- нибудь порожденный процесс. (Такая периодическая проверка известна как опрашивание события.)"

или вот такое

http://citforum.ru/programming/unix/proc_&_threads/

«Для того, чтобы процесс не оставлял зомби, можно вызывать функцию waitpid() периодически (с флагом NOHANG, чтобы она не блокировала вызвавший процесс если в системе нет зомби).»

Что полностью отвечает здравому смыслу (иначе напуркуа такую опцию вообще вводить)?

Опять-таки, зачем ты делаешь поллинг в цикле если waitpid может сам ждать наступление нужного события (хинт — убери sleep и os.WNOHANG)?

Подумай? Вот у меня форкнуто четрые процесса, три быстро завершились а один затупил, и я вишу на его waitpid-е. Клево? Это называется «разбалансировка загрузки». Вот в ветке else так можно сделать, да

else:
    for p in pids: os.waitpid(p, 0)
    print 'finished'; sys.exit()
это я потом, спросонья уже допер;-)

Есть же multiprocessing, есть другие готовые средства...

Я начинаю за тебя волноваться. Сколько раз мне нужно повторить, что жестким и необходимым требованием в данном случае является прямой вызов форка? Кроме того, я не очень понимаю нафига мне монстр-multipricessing, если задачи НЕ взаимодействуют. Ну кроме того, что мастер поглядывает кто досчитался и запускает следующего - как то на полноценное взаимодействие это ИМНО не тянет...

Тебя обманули, я неплохо вытягиваю проекты типа того что ты здесь показываешь :)

Пока я этого не заметил, извини. Кроме того, я тут не говорю о ПРОЕКТЕ целиком - я говорю о мааааленьком фрагменте большой задачи. И твоя реакция - реакция настоящего программиста «у вас тут усе ужастно и страшно, так делать совсем нельзя, давайте все перепишем стандартными средствами (и еще прикрутим шлюх, блэкджек и SQL/dbus/веб сервис)». То, что при этом задача потеряет смысл из виду упускается. Именно поэтому на моей полянке от настоящих программистов толку мало - вы гораздо лучше знаете как правильно писать программы, но вам довольно сложно объяснить что именно нужно написать, крайне сложно объяснить зачем это нужно написать, и совершенно невозможно объяснить почему нужно написать именно это, а не что то иное.

Исправление AIv, :

Имхо, нельзя два раза вызывать waitpid (и аналогичные функции) на один и тот же pid (ибо это одноразовый clean-up action).

Правда? Че то я в документации такого не нашел. Зато нашел вот такое

http://wm-help.net/lib/b/book/2075737573/186

" WNOHANG

Если ни один порожденный процесс не завершился, вернуться немедленно. Таким способом можно периодически проверять, не закончился ли какой- нибудь порожденный процесс. (Такая периодическая проверка известна как опрашивание события.)"

или вот такое

http://citforum.ru/programming/unix/proc_&_threads/

«Для того, чтобы процесс не оставлял зомби, можно вызывать функцию waitpid() периодически (с флагом NOHANG, чтобы она не блокировала вызвавший процесс если в системе нет зомби).»

Что полностью отвечает здравому смыслу (иначе напуркуа такую опцию вообще вводить)?

Опять-таки, зачем ты делаешь поллинг в цикле если waitpid может сам ждать наступление нужного события (хинт — убери sleep и os.WNOHANG)?

Подумай? Вот у меня форкнуто четрые процесса, три быстро завершились а один затупил, и я вишу на его waitpid-е. Клево? Это называется «разбалансировка загрузки». Вот в ветке else так можно сделать, да (это я потом, спросонья уже допер);-)

Есть же multiprocessing, есть другие готовые средства...

Я начинаю за тебя волноваться. Сколько раз мне нужно повторить, что жестким и необходимым требованием в данном случае является прямой вызов форка? Кроме того, я не очень понимаю нафига мне монстр-multipricessing, если задачи НЕ взаимодействуют. Ну кроме того, что мастер поглядывает кто досчитался и запускает следующего - как то на полноценное взаимодействие это ИМНО не тянет...

Тебя обманули, я неплохо вытягиваю проекты типа того что ты здесь показываешь :)

Пока я этого не заметил, извини. Кроме того, я тут не говорю о ПРОЕКТЕ целиком - я говорю о мааааленьком фрагменте большой задачи. И твоя реакция - реакция настоящего программиста «у вас тут усе ужастно и страшно, так делать совсем нельзя, давайте все перепишем стандартными средствами (и еще прикрутим шлюх, блэкджек и SQL/dbus/веб сервис)». То, что при этом задача потеряет смысл из виду упускается. Именно поэтому на моей полянке от настоящих программистов толку мало - вы гораздо лучше знаете как правильно писать программы, но вам довольно сложно объяснить что именно нужно написать, крайне сложно объяснить зачем это нужно написать, и совершенно невозможно объяснить почему нужно написать именно это, а не что то иное.

Исходная версия AIv, :

Имхо, нельзя два раза вызывать waitpid (и аналогичные функции) на один и тот же pid (ибо это одноразовый clean-up action).

Правда? Че то я в документации такого не нашел. Зато нашел вот такое

http://wm-help.net/lib/b/book/2075737573/186

" WNOHANG

Если ни один порожденный процесс не завершился, вернуться немедленно. Таким способом можно периодически проверять, не закончился ли какой- нибудь порожденный процесс. (Такая периодическая проверка известна как опрашивание события.)"

или вот такое

http://citforum.ru/programming/unix/proc_&_threads/

«Для того, чтобы процесс не оставлял зомби, можно вызывать функцию waitpid() периодически (с флагом NOHANG, чтобы она не блокировала вызвавший процесс если в системе нет зомби).»

Что полностью отвечает здравому смыслу (иначе напуркуа такую опцию вообще вводить)?

Опять-таки, зачем ты делаешь поллинг в цикле если waitpid может сам ждать наступление нужного события (хинт — убери sleep и os.WNOHANG)?

Подумай? Вот у меня форкнуто четрые процесса, три быстро завершились а один затупил, и я вишу на его waitpid-е. Клево? Это называется «разбалансировка загрузки».

Есть же multiprocessing, есть другие готовые средства...

Я начинаю за тебя волноваться. Сколько раз мне нужно повторить, что жестким и необходимым требованием в данном случае является прямой вызов форка? Кроме того, я не очень понимаю нафига мне монстр-multipricessing, если задачи НЕ взаимодействуют. Ну кроме того, что мастер поглядывает кто досчитался и запускает следующего - как то на полноценное взаимодействие это ИМНО не тянет...

Тебя обманули, я неплохо вытягиваю проекты типа того что ты здесь показываешь :)

Пока я этого не заметил, извини. Кроме того, я тут не говорю о ПРОЕКТЕ целиком - я говорю о мааааленьком фрагменте большой задачи. И твоя реакция - реакция настоящего программиста «у вас тут усе ужастно и страшно, так делать совсем нельзя, давайте все перепишем стандартными средствами (и еще прикрутим шлюх, блэкджек и SQL/dbus/веб сервис)». То, что при этом задача потеряет смысл из виду упускается. Именно поэтому на моей полянке от настоящих программистов толку мало - вы гораздо лучше знаете как правильно писать программы, но вам довольно сложно объяснить что именно нужно написать, крайне сложно объяснить зачем это нужно написать, и совершенно невозможно объяснить почему нужно написать именно это, а не что то иное.