初始化和销毁​​Python多处理工作程序

Sno*_*gus 7 python multiprocessing

我有一个模型,我从Python多次调用.该模型需要很长时间才能启动和关闭,但只需很短的时间来处理输入数据(可以在启动/关闭之间多次完成).多处理Pool()似乎是完成这项工作的好方法,但是我无法正确地将Model()类转换为destory.

下面给出了程序代码的简化结构.实际上,init和del函数需要使用win32com.client模块做一些聪明的事情,而model.y变量是控制外部应用程序的句柄.

#!/usr/bin/env python

import multiprocessing
import random
import time

class Model():
    def __init__(self):
        self.y = random.randint(0,5) # simplification
        time.sleep(5) # initialisation takes a while...
    def __del__(self):
        del(self.y) # simplification
        time.sleep(1) # destruction isn't especially quick either

def init():
    global model
    model = Model()

def f(x): # worker function, runs quickly
    return model.y * x ** 2

def main():
    pool = multiprocessing.Pool(processes=2, initializer=init)
    it = pool.imap(f, range(4))
    for n in range(4):
        print it.next()
    pool.close()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

从来没有为Model()调用del函数,我猜是因为垃圾收集器中存在一些引用.如何确保在程序结束时正确关闭模型?

Seb*_*erk 2

johnthexiii 的解决方案将在第一次运行工作函数时终止模型。你可以提供一个单独的销毁函数:

\n\n
import time\n\ndef g(x): # destroy function\n    del model\n    time.sleep(1) # to ensure, this worker does not pick too many\n    return None\n
Run Code Online (Sandbox Code Playgroud)\n\n

pool.close()添加之前

\n\n
pool.map_async(g, range(2), 1) # if specified to have two processes before\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不认为\xe2\x80\x99t 认为,这是一个非常\xe2\x80\x9cclean\xe2\x80\x9d 解决方案,但它应该有效。

\n

  • 如何阻止池中的单个工作人员请求多个关闭请求,而其他工作人员却没有收到任何关闭请求? (3认同)