Python3 Многопроцессорность os.fork работает на одном ресурсе? - PullRequest
0 голосов
/ 30 мая 2020
import os
a=[]
pid=os.fork()
if(pid!=0):
    a.append(1)
    print("Original: ", end='')
    print(a,id(a))
else:
    a.append(2)
    print("Child: ", end='')
    print(a,id(a))

# Result:
# Original: [1] 139725666412296
# Child: [2] 139725666412296

1. Почему родительский и дочерний процессы имеют один и тот же идентификатор ресурса?
2. Если у них одинаковый идентификатор, то почему после добавления 2 в список дочерний процесс не распечатал 2?

3. Затем я распечатал (в новом блоке кода записной книжки Jupyter), что теперь содержит lst после выполнения вышеуказанного блока кода. Он печатает: [1]. Если родительский процесс выполняется первым, а дочерний - последним, почему lst не [1,2]?

1 Ответ

1 голос
/ 30 мая 2020

[Частичный ответ: я отвечаю на ваши вопросы 1 и 2, но не 3.]

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

Это означает, что для ответа на ваши вопросы 1 и 2 идентификатор объекта тот же, потому что он был создан до вилки, но назначения, выполненные после вилки, не будут видны в другом процессе. В любом случае у вас нет контроля над временем выполнения в родительском и дочернем процессах (но даже если время менялось, результаты каждого из них не пострадали бы, только, возможно, порядок, в котором они были сопоставлены).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...