擅长:python、mysql、java
<p>@martineau答案应该有用。这里有一个更通用的方法,应该适用于其他情况。请注意,<code>__exit__()</code>中不处理异常。如果一个<code>__exit__()</code>函数失败,其余的函数将不会被调用。通用解决方案可能会抛出聚合异常并允许您处理它。另一种情况是当您的第二个管理器的<code>__enter__()</code>方法抛出异常时。在这种情况下,不会调用第一个管理器的<code>__exit__()</code>。你知道吗</p>
<pre><code>class list_context_manager:
def __init__(self, managers):
this.managers = managers
def __enter__(self):
for m in self.managers:
m.__enter__()
return self.managers
def __exit__(self):
for m in self.managers:
m.__exit__()
</code></pre>
<p>然后可以像在你的问题中那样使用:</p>
<pre><code>with list_context_manager([SomeAsyncTask(params) for params in list_of_async_task_params]) as tasks:
# do stuff with `tasks`
for task in tasks:
task.thread.start()
for task in tasks:
task.thread.join()
</code></pre>