Основная строка каждого процесса заканчивается отображением идентификатор процесса. Каждая из двух порожденных задач также завершается, отображая идентификатор своего процесса. В журнале показано, что сначала печатаются основные сообщения, а затем вызывается порожденная функция.
Код: Выделить всё
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
Вопрос 2. Почему процесс называется «python.exe», когда я специально назвал каждый процесс именем для его вызова?
Теперь есть еще одна проблема — дилемма многопроцессорности. Если вы добавите код
Код: Выделить всё
exit(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
Я также отметил, что если вместо вызова выхода (0) я импортирую время и вместо этого вызываю time.sleep(5), появляется сообщение «Конец основной строки», после чего основной код порожденной задачи выполняется после 5-секундной задержки. Я ожидал, что вызываемая функция запустится немедленно. Это кажется запутанным в отношении выполнения процесса, похожего на два потока. Или, возможно, он выполняет основную строку, за которой после этого следует вызываемая функция. Но важно понимать, что код становится более сложным в основной строке по сравнению с функцией, вызываемой при вызове Process().
Подробнее здесь: https://stackoverflow.com/questions/789 ... er-process