иногда forked_pid никогда не возвращает 0 - PullRequest
0 голосов
/ 17 марта 2019
import os

parent_pid = os.getpid()
print "[parent] starts PID: %d" % (parent_pid, )

forked_pid = os.fork()
if forked_pid == 0:
    print "[child] child process can't use os.fork() PID, since it's %d" % (forked_pid, )
    print "[child] but it can reevaluate os.getpid() to get it's own PID: %d" % (os.getpid(), )
else:
    print "[parent] parent process have created child with PID: %d" % (forked_pid, )

output

Если я не ставлю точку останова в строке 6 (forked_pid = os.fork()) - я получаю журнал от дочернего процесса, но если я отлаживаю - forked_pidникогда не равняется 0.

Причина, по которой я начал изучать это.

p = Process(target=self.run_threaded_io, args=(additional_threads,))
p.start()
p.join()

У меня был этот код, где сообщения журнала от run_threaded_io никогда не печатались бы - и это потому, что

class Popen(object):

    def __init__(self, process_obj):
        sys.stdout.flush()
        sys.stderr.flush()
        self.returncode = None

        self.pid = os.fork()
        if self.pid == 0:
            if 'random' in sys.modules:
                import random
                random.seed()
            code = process_obj._bootstrap()
            sys.stdout.flush()
            sys.stderr.flush()
            os._exit(code)

если pid не равен 0 - process_obj._bootstrap(), этого никогда не произойдет - который внутренне собирался вызвать run для target, т.е. run_threaded_io и присоединение к основному процессу (p.join()) никогда не завершится.и я бежал в тайм-аут.

1 Ответ

0 голосов
/ 17 марта 2019

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

...