使用with语句基本上有三种方法:
使用现有的上下文管理器:
with manager:
pass
Run Code Online (Sandbox Code Playgroud)
创建上下文管理器并将其结果绑定到变量:
with Manager() as result:
pass
Run Code Online (Sandbox Code Playgroud)
创建上下文管理器并丢弃其返回值:
with Manager():
pass
Run Code Online (Sandbox Code Playgroud)
如果我们get_manager()在上面的三个块中放置了一个函数,是否有任何实现可以返回封闭的上下文管理器,或者至少它们的__exit__函数?
在第一种情况下,这显然很容易,但我想不出能让它在另外两种情况下工作的方法.我怀疑是否可以获得整个上下文管理器,因为值堆栈会在SETUP_WITH操作码之后立即弹出.但是,由于__exit__函数存储在块堆栈中SETUP_WITH,是否有某种方法可以访问它?
我想要一个上下文管理器,我可以在其中放置一些要在单独的线程中执行的代码。
到目前为止,我找不到一种方法来实现我想要的,最好的选择是编写闭包并在单独的线程中执行闭包。
我想要这样的东西
# code runs on main thread
print("this is main thread")
with amazingcontextmanager:
# code to run in separate thread
print("this is not main thread")
Run Code Online (Sandbox Code Playgroud)
编辑:让我尝试再次问我的问题
@contextlib.contextmanager
def amazingcontextmanager():
try:
yield
finally:
print("thread done")
Run Code Online (Sandbox Code Playgroud)
我想yield在新线程中执行。基本上我放在 contextmanager 下的任何内容都应该在单独的线程中执行。
作为一个基本示例,请想象以下内容:
with runFiveTimes:
print("test")
Run Code Online (Sandbox Code Playgroud)
这在Python中可能吗?
(这个例子只是为了澄清问题,显然有更简单的方法来实现这个特定的例子)