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, )
Если я не ставлю точку останова в строке 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()
) никогда не завершится.и я бежал в тайм-аут.