Связь между потоком и процессом в многопроцессной программе

ОС: debian9.
Простая многопроцессорная программа с именем mprocesses.py.

import os
import multiprocessing

def run_task(name):
    print("task %s (pid = %s) is running"  %(name,os.getpid()))
    while True:
        pass

if __name__ == "__main__":
    print("current process %s ." %os.getpid())
    pool = multiprocessing.Pool(processes = 2)
    for i in range(2):
        pool.apply_async(run_task,args=(i,))
    pool.close()
    pool.join()

Запустите python3 mprocesses.py и оставьте ниже вывода.

python3 mprocesses.py
current process 6145 .
task 0 (pid = 6146) is running
task 1 (pid = 6147) is running

Получить информацию о процессах.

ps lax |grep 'python3 mprocesses.py' |grep -v grep 
0  1000  6145  5615  20   0 275428 14600 -      Sl+  pts/1      0:00 python3 mprocesses.py
1  1000  6146  6145  20   0  54232 10340 -      R+   pts/1      1:01 python3 mprocesses.py
1  1000  6147  6145  20   0  54232 10348 -      R+   pts/1      1:01 python3 mprocesses.py

Проверить дерево процессов.

pstree -p 5615
bash(5615)───python3(6145)─┬─python3(6146)
                           ├─python3(6147)
                           ├─{python3}(6148)
                           ├─{python3}(6149)
                           └─{python3}(6150)

Что меня смутило, это три потока 6148,6149,6150.
Означает ли это, что каждый процесс содержит один процесс? Возможно, мой логический граф лучше выражает отношения между процессами и потоками.

bash(5615)───python3(6145)─┬─────────────────python3(6146)
                           |                    └─{python3}(6149)
                           |             
                           ├──────────────────python3(6147)
                           ├─{python3}(6148)     └─{python3}(6150)

1.bash(5615) - процесс отца python3 mprocesses.py (6145).
2. python3 mprocesses.py (6145) содержит два процесса 6146 и 6147, созданные pool = multiprocessing.Pool(processes = 2).
3.Process(6145) содержит поток (6148), процесс (6146) содержит поток (6149), процесс (6147) содержит нить (6150).
Независимо от того, какой именно идентификатор процесса содержит идентификатор потока. Правильно ли я понимаю?

Ответ 1

У вас есть:

  • 3 процесса (1 родительский процесс и 2 ребенка в соответствии с вашим аргументом processes = 2)
  • 2 потока в каждом процессе (1 основной поток и 1 поток связи и управления)

Дополнительный поток связи и управления для каждого процесса является деталью реализации модуля multiprocessing; если вы разделяете ресурсы между процессами, можно использовать больше потоков. Вы можете видеть, что потоки используются для этих задач в документации

Например, в разделе Pipes and Queues:

Примечание. Когда объект помещается в очередь, объект маринован, а фоновый поток позже очищает маринованные данные до лежащего в его основе.

[...]

class multiprocessing.Queue([maxsize])
 Возвращает очередь процессов, реализованную с использованием канала и нескольких блокировок/семафоров. Когда процесс сначала помещает элемент в очередь, запускается поток фидера, который переносит объекты из буфера в канал.

(курсив мой)

Вам не нужно беспокоиться об этих потоках; они там, чтобы реализовать многопроцессорную функциональность и заставить ее работать бесперебойно.