Многопроцессорность Python – создает ли он два потока для каждого процесса?Python

Программы на Python
Anonymous
Многопроцессорность Python – создает ли он два потока для каждого процесса?

Сообщение Anonymous »

Эта программа запускает два процесса. Похоже, что на самом деле для каждого процесса может быть создано два потока. Один из них представляет собой основной код порожденной программы Python, а другой — выполнение функции, которая была вызвана для запуска процесса. Вывод программы показывает, что как основная строка программы выполняется в каждом процессе, так и вызывается вызываемая функция, указанная при создании процесса.
Основная строка каждого процесса заканчивается отображением идентификатор процесса. Каждая из двух порожденных задач также завершается, отображая идентификатор своего процесса. В журнале показано, что сначала печатаются основные сообщения, а затем вызывается порожденная функция.

Код: Выделить всё

from multiprocessing import Process
import os
import psutil

def f(name):
print('\nStarting process ID:', os.getpid())
print ('I am process with argument: ', name)
print ('parent: ', os.getppid())
print ('process name: ', psutil.Process().name())

if __name__ == '__main__':
print ('\nMain process ID:', os.getpid(), '\n')

p = Process(target=f, name='process-1', args=('passed-name1',))
p.start()
p.join()
print ('\nAfter 1st join, PID:', os.getpid(),'\n')

p = Process(target=f, name='process-2', args=('passed-name2',))
p.start()
p.join()
print ('\nAfter 2 joins, PID:',os.getpid(),'\n')

print ('End mainline code for PID',os.getpid())
Я ожидал, что сообщение «Выполнено при завершении задачи» появится, когда процесс завершит свою работу. Но я обнаружил, что он выполняется ДО того, как он запустит основной код процесса.
Вот выходные данные этой программы:

Код: Выделить всё

Main process ID: 5528

End mainline code for PID: 42368

Starting process ID: 42368
I am process with argument:  passed-name1
parent:  5528
process name:  python.exe

After 1st join, PID: 5528

End mainline code for PID: 17764

Starting process ID: 17764
I am process with argument:  passed-name2
parent:  5528
process name:  python.exe

After 2 joins, PID: 5528

End mainline code for PID: 5528
Вопрос 1. Получается, что функция Process() одновременно порождает всю программу и запускает именованную функцию как отдельный процесс?
Вопрос 2. Почему процесс называется «python.exe», когда я специально назвал каждый процесс именем для его вызова?
Теперь есть еще одна проблема — дилемма многопроцессорности. Если вы добавите код

Код: Выделить всё

exit(0)
как последняя строка кода, после напечатанного сообщения о завершении, основная строка двух порожденных задач вообще не выполняется. Вот результат кода, если выход (0) добавлен в последнюю строку:

Код: Выделить всё

Main process ID: 36996

End mainline code PID: 39976

After 1st join, PID: 36996

End mainline code PID: 28324

After 2 joins, PID: 36996

End mainline code PID: 36996
Таким образом, основной код каждого процесса выполнялся, а функция, вызываемая функцией Process(), — нет.
Я также отметил, что если вместо вызова выхода (0) я импортирую время и вместо этого вызываю time.sleep(5), появляется сообщение «Конец основной строки», после чего основной код порожденной задачи выполняется после 5-секундной задержки. Я ожидал, что вызываемая функция запустится немедленно. Это кажется запутанным в отношении выполнения процесса, похожего на два потока. Или, возможно, он выполняет основную строку, за которой после этого следует вызываемая функция. Но важно понимать, что код становится более сложным в основной строке по сравнению с функцией, вызываемой при вызове Process().

Подробнее здесь: https://stackoverflow.com/questions/789 ... er-process

Вернуться в «Python»