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

标签 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()

运行 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

检查进程 TreeView 。

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.进程(6145)包含线程(6148),进程(6146)包含线程(6149),进程(6147)包含线程(6150)。
无论哪个确切的进程 ID 包含哪个线程 ID 都没有关系。
我的理解对吗?

最佳答案

你有:

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

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

例如Pipes and Queues下:

Note: When an object is put on a queue, the object is pickled and a background thread later flushes the pickled data to an underlying pipe.

[...]

class multiprocessing.<b>Queue</b>([maxsize])
Returns a process shared queue implemented using a pipe and a few locks/semaphores. When a process first puts an item on the queue a feeder thread is started which transfers objects from a buffer into the pipe.

(斜体强调我的)

您无需担心这些线程;他们在那里实现多处理功能并使其顺利运行。

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

相关文章:

python - 我想停止线程时不停止

python - 如何使用 Python tkinter 在另一个框架的文本框中显示过程输出

python - 在线程操作期间避免 PyQt5 GUI 卡住?

python - 故意导致读/写超时?

c#.net 4.5 异步/多线程?

python - 如何在 boto3 中设置 executionRoleArn 的值?

WPF ObservableCollection 不更新?

c++ - 数百个空闲线程的影响

c++ - 使用 Visual C++ Express 10 链接到 boost::python

Python 3 与 Bs4 的抓取