'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)。
答案 0 :(得分:2)
multiprocessing.Manager
通过创建“服务器”进程来工作,该进程负责容纳您的所有共享数据。然后,主进程和工作进程通过代理与服务器进程中的托管对象进行通信。正如docs(强调我的)所述:
管理员提供了一种创建可在其间共享的数据的方法 不同的流程,包括通过网络共享 在不同机器上运行的进程。 管理器对象控制a 服务器进程,用于管理共享对象。其他流程可以 使用代理访问共享对象。
在没有生成服务器进程的情况下,无法使用Manager
;服务器进程是Manager
功能的核心部分。