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)包含由pool = multiprocessing.Pool(processes = 2)
创建的两个过程6146和6147
3.Process(6145)包含线程(6148),Process(6146)包含线程(6149),Process(6147)包含线程(6150)。
无论哪个精确的进程id包含哪个线程id都可以
我的理解是对的吗?
答案 0 :(得分:15)
你有:
processes = 2
参数)每个进程的额外通信和管理线程是multiprocessing
模块的实现细节;如果您在进程之间共享资源,则可以使用更多线程。您可以在文档
例如,在Pipes and Queues下:
注意:当一个对象被放入队列时,该对象被腌制,后台线程随后将pickle数据刷新到底层管道。
[...]
class multiprocessing.Queue([maxsize])
返回使用管道和一些锁/信号量实现的进程共享队列。当一个进程首先将一个项目放在队列上时,就会启动一个支持线程,它将对象从缓冲区传输到管道中。
(斜体强调我的)
您无需担心这些线程;他们在那里实现多处理功能并使其全部顺利运行。