Руководство по стилю в стиле 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
Вот как разветвить 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.
}
Это можно сделать с помощью форка . Данный родитель может разветвляться сколько угодно раз. Однако я согласен с 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
}
Я думаю, стоит указать, почему потоки здесь более уместны:
Поскольку вы пытаетесь сделать " часть "параллельной работы. Я предполагаю, что вашей программе необходимо знать о результате вычисления. fork () процесса не t разделяют больше, чем исходную информацию после fork (). Каждое изменение в одном процессе неизвестно другому, и вам нужно будет передать информацию в виде сообщения (например, через канал, см. «Man pipe»). Потоки в процессе разделяют одно и то же адресное пространство и, следовательно, могут манипулировать данными и делать их видимыми для других "немедленно". Кроме того, добавляя преимущества облегчения, я бы выбрал pthreads ().
В конце концов: вы узнаете все, что вам нужно знать о fork (), если вы все равно будете использовать pthreads.