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函数,我猜是因为垃圾收集器中存在一些引用.如何确保在程序结束时正确关闭模型?
johnthexiii 的解决方案将在第一次运行工作函数时终止模型。你可以提供一个单独的销毁函数:
\n\nimport 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\nRun Code Online (Sandbox Code Playgroud)\n\npool.close()添加之前
pool.map_async(g, range(2), 1) # if specified to have two processes before\nRun Code Online (Sandbox Code Playgroud)\n\n我不认为\xe2\x80\x99t 认为,这是一个非常\xe2\x80\x9cclean\xe2\x80\x9d 解决方案,但它应该有效。
\n| 归档时间: |
|
| 查看次数: |
1890 次 |
| 最近记录: |