如何包装上下文管理器类?

时间:2017-08-13 23:46:00

标签: python python-3.x multiprocessing with-statement contextmanager

我写了一个虚拟类来管理一些类似于我的真实项目的IO进程。由于无法保证调用>>> from stdlib_list import stdlib_list >>> libs = stdlib_list() >>> libs[-10:] ['xml.sax', 'xml.sax.handler', 'xml.sax.saxutils', 'xml.sax.xmlreader', 'xmlrpc.client', 'xmlrpc.server', 'zipapp', 'zipfile', 'zipimport', 'zlib'] (请参阅:Alternative to __del__ for final result & killing processes in a class?),我现在使用上下文管理器的建议方法,该方法可以正常工作。

然而,有一个问题:如果其他人"忘记"在__del__声明中使用我的课程?如果我想要几个这样的类怎么办?这最终会出现在几个with - 封装中?!

这就是我想在包装类中包装with - 语句的原因:

with

这样可以方便使用,并确保始终正确使用class EndProcessWrapper(object): @staticmethod def get_end_process(): with EndProcessWrapper.EndProcess() as ep: return ep class EndProcess(object): def __init__(self): pass def worker(self, name): while True: rnd = random.randint(0, 100) self._Q.put((name, rnd)) print(name, rnd) time.sleep(1) def __enter__(self): self._Q = multiprocessing.Queue() self.p1 = multiprocessing.Process(target=self.worker, args=("p1",)) self.p2 = multiprocessing.Process(target=self.worker, args=("p2",)) self.p3 = multiprocessing.Process(target=self.worker, args=("p3",)) self.p1.start() self.p2.start() self.p3.start() return self def __exit__(self, exc_type, exc_val, traceback): print("printing queue contents") while not self._Q.empty(): print(self._Q.get()) print("terminating processes") self.p1.terminate() self.p2.terminate() self.p3.terminate() if __name__ == "__main__": ep = EndProcessWrapper.get_end_process() ... time.sleep(5) (在EndProcess - 语句中)。

但是,这不起作用,因为(显然)with会立即返回return ep对象,因此会结束with语句(导致调用EndProcess)。

是否有一种pythonic方法来包装__exit__ - 语句?

0 个答案:

没有答案