Python 多进程程序中线程与进程的关系

Python 多进程程序中线程与进程的关系,python,multithreading,python-multithreading,Python,Multithreading,Python Multithreading,操作系统:debian9。 一个名为mpprocesses.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 ." %

操作系统:debian9。
一个名为
mpprocesses.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 mpprocesses.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)
让我困惑的是三条线614861496150。
这是否意味着每个流程都包含一个流程? 也许我的逻辑图更适合在这里表示进程和线程之间的关系

bash(5615)───python3(6145)─┬─────────────────python3(6146)
                           |                    └─{python3}(6149)
                           |             
                           ├──────────────────python3(6147)
                           ├─{python3}(6148)     └─{python3}(6150)
1.bash(5615)是
python3mpprocesses.py
(6145)的父进程。
2.
python3 mpprocesses.py
(6145)包含由
pool=multiprocessing.pool(processes=2)
创建的两个进程6146和6147 3.进程(6145)包含线程(6148),进程(6146)包含线程(6149),进程(6147)包含线程(6150)。
无论哪个进程id包含哪个线程id,它都不会起作用。
我的理解正确吗

您有:

  • 3个进程(1个父进程和2个子进程以匹配
    进程=2
    参数)
  • 每个进程2个线程(1个主线程,1个通信和管理线程)
每个进程的额外通信和管理线程是
多处理
模块的实现细节;如果在进程之间共享资源,则可能会使用更多线程。您可以在文档中看到线程用于这些任务的提示

例如,根据:

注意:将对象放入队列时,对象将被pickle,后台线程随后将pickle数据刷新到底层管道

[……]

类多处理。队列([maxsize])

返回使用管道和几个锁/信号量实现的进程共享队列。当一个进程第一次将一个项目放入队列时,将启动一个feeder线程,该线程将对象从缓冲区传输到管道中

(斜体强调矿井)

你不需要担心这些线程;它们是用来实现多处理功能并使其顺利运行的