LINUX.ORG.RU

[python] не умирает созданный Process()

 


0

1

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

когда основной поток останoвлен - этот процесс продолжает висеть в памяти
чтобы убедиться что это не крутится бесконечный цикл в нем - заставил его сoздавать пустые файлы на каждой итерации
он их не создает - значит делo не в цикле.

попрoбовал strace:

futex(0x9d29780, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
gettimeofday({1325059674, 581282}, NULL) = 0
clock_gettime(CLOCK_REALTIME, {1325059674, 581337792}) = 0
futex(0x81d82c4, FUTEX_WAIT_PRIVATE, 23233, {0, 4944208}) = 0
futex(0x81d82a0, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0x81d82a0, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x9d29780, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
futex(0x9d29780, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>

подскажите, что ждет этот прoцесс и как его грамoтно завершить?

Никогда не юзал этот модуль, но попробую помочь.

когда основной поток останoвлен - этот процесс продолжает висеть в памяти

В смысле когда родительский процесс умирает или что? Возможно так и задумано :)

Вообще, в доке написано что лучше бы делать join на все дочерние процессы :).

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Если смотреть доки по POSIX-тредам, то я полагаю, что дочерний Process (который thread) был не в detach-state, а родительский к нему неприjoin'ился. Если речь идёт о процессах (a'la fork), то дочерний при этом ещё и стал zombie.

Delirium_veritas
()
import time
from multiprocessing import Process

def worker():
    while True:
        print "I'm worker and I'm alive"
        time.sleep(1)

if __name__ == '__main__':
    p = Process(target=worker)
    p.daemon = True
    p.start()
    time.sleep(5)
    print 'Exit from parent'
baverman ★★★
()
Ответ на: комментарий от baverman

Но вообще, по хорошему, надо в процесс передавать флаг и периодически его чекать. Или подписаться на сигнал, но это чревато непредсказуемым прерыванием, нужна аккуратность.

baverman ★★★
()
Ответ на: комментарий от Delirium_veritas

то дочерний при этом ещё и стал zombie.

не-не, если бы он был zombie то к нему нельзя было бы strace сделать. Потому что zombie это то что уже умерло, но какие-то следы в списке процессов ещё остались чтобы родитель мог сделать waitpid(). Если родителя уже нет то и zombie-процесс будет сразу подобран init.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

это точно не зомби, у него в ps статус Sl

я делал общий Event() (из multiprocessing), который создается в родительском процессе, чтобы он видел когда надо остановиться

кстати сейчас подумалось, что раз родительский сдох, то и созданный в нем Event должен пропасть, правильно?

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

ещё блин в последующие запуски он таки завершается, поэтому проблема не постоянная

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

то и созданный в нем Event должен пропасть, правильно?

хз, там что-то в доках было на эту тему сказано, но я уже не помню. Лучше перечитать.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.