操作系统: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

检查进程树 View 。
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)包含两个由pool = multiprocessing.Pool(processes = 2)创建的进程6146和6147。
3.Process(6145)包含线程(6148),Process(6146)包含线程(6149),Process(6147)包含线程(6150)。
无论哪个确切的进程ID包含哪个线程ID都无关紧要。
我的理解正确吗?

最佳答案

你有:

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

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

    例如,在Pipes and Queues下:



    (斜体强调我的)

    您无需担心这些线程。他们在那里实现了多处理功能,并使它们都能平稳运行。

    关于python - 多进程程序中线程与进程之间的关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48435348/

    10-11 22:48
    查看更多