1

によって生成されたプロセスによって消費されるメモリはmultiprocessing.Process、プロセスが結合されると解放されますか?

私が念頭に置いているシナリオは、おおよそ次のようなものです。

from multiprocessing import Process
from multiprocessing import Queue
import time
import os

def main():
  tasks = Queue()  
  for task in [1, 18, 1, 2, 5, 2]:
    tasks.put(task)

  num_proc = 3           # this many workers @ each point in time
  procs = []
  for j in range(num_proc):
     p = Process(target = run_q, args = (tasks,))  
     procs.append(p)
     p.start()

  # joines a worker once he's done
  while procs:
    for p in procs:
        if not p.is_alive():
            p.join()        # what happens to the memory allocated by run()?  
            procs.remove(p)
            print p, len(procs)
    time.sleep(1)  

def run_q(task_q):
    while not task_q.empty():  # while's stuff to do, keep working
        task = task_q.get()
        run(task)

def run(x):       # do real work, allocates memory
    print x, os.getpid()
    time.sleep(3*x)


if __name__ == "__main__":
  main()  

実際のコードでは、 の長さはtasksCPU コアの数よりもはるかに大きく、それぞれtaskが軽量であり、タスクごとに CPU 時間 (数分から数日) とメモリの量 (ピーナッツから数 GB) が大きく異なります。 . このメモリはすべて に対してローカルでrunあり、共有する必要はありません --- したがって、問題は、runが戻ったとき、および/またはプロセスが結合されたときに解放されるかどうかです。

4

1 に答える 1

3

プロセスが消費したメモリは、プロセスが終了すると解放されます。あなたの例では、これは run_q() が戻ったときに起こります。

于 2012-10-16T23:18:07.423 に答える