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

it_*_*ure 12 python multithreading python-multithreading

操作系统: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()
Run Code Online (Sandbox Code Playgroud)

运行python3 mprocesses.py并获得低于输出.

python3 mprocesses.py
current process 6145 .
task 0 (pid = 6146) is running
task 1 (pid = 6147) is running
Run Code Online (Sandbox Code Playgroud)

获取流程信息.

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
Run Code Online (Sandbox Code Playgroud)

检查进程树视图.

pstree -p 5615
bash(5615)???python3(6145)???python3(6146)
                           ??python3(6147)
                           ??{python3}(6148)
                           ??{python3}(6149)
                           ??{python3}(6150)
Run Code Online (Sandbox Code Playgroud)

令我感到困惑的是三线程6148,6149,6150.
这是否意味着每个流程都包含一个流程?也许我的逻辑图更好地表达进程和线程之间的关系.

bash(5615)???python3(6145)???????????????????python3(6146)
                           |                    ??{python3}(6149)
                           |             
                           ???????????????????python3(6147)
                           ??{python3}(6148)     ??{python3}(6150)
Run Code Online (Sandbox Code Playgroud)

1.bash(5615)是python3 mprocesses.py(6145)的父亲过程.
2. python3 mprocesses.py(6145)包含由两个进程6146和6147创建的pool = multiprocessing.Pool(processes = 2).
3.Process(6145)包含线程(6148),Process(6146)包含线程(6149),Process(6147)包含线程(6150).
无论哪个精确的进程id包含哪个线程id都可以.
我的理解是对的吗?

Mar*_*ers 15

你有:

  • 3个进程(1个父进程和2个子进程匹配你的processes = 2参数)
  • 每个进程中有2个线程(1个主线程,1个通信和管理线程)

每个进程的额外通信和管理线程是multiprocessing模块的实现细节; 如果您在进程之间共享资源,则可以使用更多线程.您可以在文档中看到线程用于这些任务的提示

例如,在管道和队列下:

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

[...]

class multiprocessing.Queue([maxsize])
返回使用管道和一些锁/信号量实现的进程共享队列.当进程首先将项目放入队列,将启动一个馈送线程,该线程将对象从缓冲区传输到管道中.

(斜体强调我的)

你不必担心这些线程; 他们在那里实现多处理功能并使其全部运行顺利.