为什么multiprocessing.Manager会创建一个额外的进程?

时间:2017-09-26 15:11:35

标签: python python-3.x multiprocessing

'dob' => $data['dob'],

我使用#!/usr/bin/env python import multiprocessing import sys import time def sleeping_worker(state): s_time = state['sleep_time'] print('sleeping_worker: start to sleep for {0} seconds'.format(s_time)) time.sleep(s_time) def main(): # the main has been seen manager = multiprocessing.Manager() # the main and the worker threadA has been seen time_to_sleep = 10 state = manager.dict(sleep_time=time_to_sleep) while True: state = manager.dict(sleep_time=time_to_sleep) worker = multiprocessing.Process(target=sleeping_worker, args=(state, )) worker.start() # the main, the worker threadA and the worker threadB have been seen worker.join() # the main and worker threadA has been seen print('main: return from sleeping_worker') if __name__ == "__main__": main() """ xx 22897 25004 0 10:00 pts/0 00:00:00 python ./testThread.py xx 22898 22897 0 10:00 pts/0 00:00:00 python ./testThread.py xx 22960 22897 0 10:00 pts/0 00:00:00 python ./testThread.py the main thread: 22897 the worker threadA: 22898 the worker threadB: 22960 """ 创建一个工作进程,但我发现创建了两个工作进程。工作进程A与主进程同时运行。 worker processB只运行10秒,然后它将终止并重新开始。

根据我的观察,工作进程A是在调用multiprocessing.Process之后创建的,而这根本不是预期的。调用manager = multiprocessing.Manager()时会创建工作进程B,这是预期的。

由于在实际代码中对worker.start()函数的调用很昂贵,我想彻底消除worker processA。那可能吗?理想情况下,我只希望看到两个进程(即main和worker processB)。

1 个答案:

答案 0 :(得分:2)

multiprocessing.Manager通过创建“服务器”进程来工作,该进程负责容纳您的所有共享数据。然后,主进程和工作进程通过代理与服务器进程中的托管对象进行通信。正如docs(强调我的)所述:

  

管理员提供了一种创建可在其间共享的数据的方法   不同的流程,包括通过网络共享   在不同机器上运行的进程。 管理器对象控制a   服务器进程,用于管理共享对象。其他流程可以   使用代理访问共享对象。

在没有生成服务器进程的情况下,无法使用Manager;服务器进程是Manager功能的核心部分。