Понимание хода этого «разветвленного» скрипта - PullRequest
0 голосов
/ 30 мая 2018

У меня есть этот код, и чтобы лучше понять его, я добавил строку для отслеживания, где pid равен нулю:

import os, time
def counter(count): # run in new process
    for i in range(count):
        time.sleep(0.00001) # simulate real work
        print('[%s] => %s' % (os.getpid(), i))

for i in range(5):

    pid = os.fork()
    print("The pid is: ", pid)# the one I added
    if pid != 0:
        print('Process %d spawned' % pid) # in parent: continue
    else:
        counter(5) # else in child/new process
        os._exit(0) # run function and exit
print('Main process exiting.')

Вопросы:

1) чтоактивировать звонок на счетчик?новые процессы проверяют свой pid, и если он равен нулю, то вызовем счетчик?

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

Я получил такой результат:

the pid is:  6                                                                                                                                                                     
Prociss 6 spawned                                                                                                                                                                 
the pid is:  7                                                                                                                                                                     
Prociss 7 spawned                                                                                                                                                                 
the pid is:  8                                                                                                                                                                     
Prociss 8 spawned                                                                                                                                                                 
the pid is:  9                                                                                                                                                                     
Prociss 9 spawned                                                                                                                                                                 
the pid is:  10                                                                                                                                                                    
Prociss 10 spawned                                                                                                                                                                
Main prociss exiting.                                                                                                                                                             
the pid is:  0                                                                                                                                                                     
the pid is:  0                                                                                                                                                                     
the pid is:  0                                                                                                                                                                     
the pid is:  0                                                                                                                                                                     
[6] => 0                                                                                                                                                                          
[8] => 0                                                                                                                                                                          
[7] => 0                                                                                                                                                                          
[6] => 1                                                                                                                                                                          
the pid is:  0                                                                                                                                                                     
[8] => 1                                                                                                                                                                          
[6] => 2                                                                                                                                                                          
[7] => 1                                                                                                                                                                          
[9] => 0                                                                                                                                                                          
[6] => 3                                                                                                                                                                          
[8] => 2                                                                                                                                                                          
[7] => 2                                                                                                                                                                          
[9] => 1                                                                                                                                                                          
[8] => 3                                                                                                                                                                          
[6] => 4                                                                                                                                                                          
[7] => 3                                                                                                                                                                          
[8] => 4                                                                                                                                                                          
[7] => 4                                                                                                                                                                          
[9] => 2                                                                                                                                                                          
[10] => 0                                                                                                                                                                         
[9] => 3                                                                                                                                                                          
[10] => 1                                                                                                                                                                         
[9] => 4                                                                                                                                                                          
[10] => 2                                                                                                                                                                         
[10] => 3                                                                                                                                                                         
[10] => 4                                                                                                                                                                         


...Program finished with exit code 0   

1 Ответ

0 голосов
/ 31 мая 2018

Отвечая на два ваших вопроса:

что активирует звонок на счетчик?проверяют ли новые процессы свои pid, и если он равен нулю, то вызов счетчика?

Да.os.fork() - необычный зверь в том смысле, что он «нарушает законы физики»: он возвращает дважды в двух отдельных процессах.Эти два процесса (почти) идентичны, поэтому только способ узнать, кем вы являетесь (родительским или дочерним), это посмотреть, что вернул os.fork(): если он вернул ноль, вы - ребенокв противном случае возвращаемое значение - это pid дочернего элемента.

Поскольку оба процесса выполняют строку if pid != 0, будет выполняться тот, где pid равен ноль (то есть дочерний)блок else, который будет вызывать counter.

Если я изменю время ожидания на 1 секунду (вместо десятых мил), то данные для дочерних процессов не выводятся.Что происходит в фоновом режиме?

Вы не wait для своих детей.Это означает, что, как только родительский процесс завершается, он «теряет» все свои дочерние процессы.init охотно примет их, но они могут потерять доступ к своему управляющему терминалу в процессе, и одного этого может быть достаточно, чтобы убить их.Кроме того, в современной системе Linux systemd, скорее всего, убьет детей, если вы не сказали иначе.

Как правило, если вы используете fork, вам также необходимо wait.Родитель получает pid ребенка, который был разветвлен, чтобы он мог вызвать wait на этом pid.Это служит двум целям: во-первых, он фактически ожидает выполнения дочернего процесса, а во-вторых, он позволит родителю получить код выхода от ребенка, который позволит вам узнать, успешно ли завершился дочерний процесс или он был убит,Если вы не ждете, нет 100% надежного способа узнать, что случилось с ребенком.(Даже если вы спрятали pid где-то еще, возможно, что pid может быть использован повторно, прежде чем вы сможете снова проверить.)

В танце fork / (* есть много тонкостей)* тысяча тридцать семь) / * * тысяча тридцать восемь;в их простоте есть элегантность, но если вы дотрагиваетесь до этих инструментов, существует много предполагаемых знаний.Не ожидайте, что сможете эффективно использовать fork, если вы не прочитали каких-либо руководств по нему.И если вы не хотите становиться экспертом по модели процессов Unix (и таким вещам, как обработка сигналов, управление терминалами и лидерами сеансов и т. Д.), То вам гораздо лучше использовать абстракцию более высокого уровня, чтобы скорее решить проблемучем дурачиться с вещами низкого уровня, как это.Для этого Python предлагает модуль multiprocessing, который является гораздо лучшим инструментом общего назначения.

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