我写了一个虚拟类来管理一些类似于我的真实项目的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__
- 语句?