Множественный дочерний процесс

Руководство по стилю в стиле Google содержит отличное руководство по стилю Python. Он включает в себя соглашения для читаемого синтаксиса docstring , который предлагает лучшее руководство, чем PEP-257. Например:

def square_root(n):
    """Calculate the square root of a number.

    Args:
        n: the number to get the square root of.
    Returns:
        the square root of n.
    Raises:
        TypeError: if n is not a number.
        ValueError: if n is negative.

    """
    pass

Мне нравится расширять его, чтобы также включать информацию о типе в аргументы, как описано в этом учебнике документации Sphinx . Например:

def add_value(self, value):
    """Add a new value.

       Args:
           value (str): the value to add.
    """
    pass

13
задан israkir 18 May 2009 в 08:02
поделиться

3 ответа

Вот как разветвить 10 дочерних элементов и дождаться их завершения:

pid_t pids[10];
int i;
int n = 10;

/* Start children. */
for (i = 0; i < n; ++i) {
  if ((pids[i] = fork()) < 0) {
    perror("fork");
    abort();
  } else if (pids[i] == 0) {
    DoWorkInChild();
    exit(0);
  }
}

/* Wait for children to exit. */
int status;
pid_t pid;
while (n > 0) {
  pid = wait(&status);
  printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status);
  --n;  // TODO(pts): Remove pid from the pids array.
}
46
ответ дан 1 December 2019 в 06:00
поделиться

Это можно сделать с помощью форка . Данный родитель может разветвляться сколько угодно раз. Однако я согласен с AviD pthreads , может быть более подходящим.

pid_t firstChild, secondChild;
firstChild = fork();
if(firstChild > 0)
{
  // In parent
  secondChild = fork();
  if(secondChild > 0)
  {
    // In parent
  }
  else if(secondChild < 0)
  {
    // Error
  }
  else
  {
    // In secondChild
  }
}
else if(firstChild < 0 )
{
  // Error
} 
else
{
  // In firstChild
}
3
ответ дан 1 December 2019 в 06:00
поделиться

Я думаю, стоит указать, почему потоки здесь более уместны:

Поскольку вы пытаетесь сделать " часть "параллельной работы. Я предполагаю, что вашей программе необходимо знать о результате вычисления. fork () процесса не t разделяют больше, чем исходную информацию после fork (). Каждое изменение в одном процессе неизвестно другому, и вам нужно будет передать информацию в виде сообщения (например, через канал, см. «Man pipe»). Потоки в процессе разделяют одно и то же адресное пространство и, следовательно, могут манипулировать данными и делать их видимыми для других "немедленно". Кроме того, добавляя преимущества облегчения, я бы выбрал pthreads ().

В конце концов: вы узнаете все, что вам нужно знать о fork (), если вы все равно будете использовать pthreads.

5
ответ дан 1 December 2019 в 06:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: