[toc]
什么是上下文(context)管理
任务(进程、线程)上下文是一个任务所必不可少的一组数据。任务在被中断之后,处理器保存上下文并提供中断处理(interrupt service routine),上下文的数据可能存放于处理器寄存器、任务所利用的内存、某些操作系统管理的任务所使用的控制寄存器,上下文越小,延迟越小。
python上下文管理
- python一般使用with对上下文进行管理,可以对对象加入__enter__ 和__exit__方法定义上下文,enter 方法可以返回任意对象,它返回的任何对象都会被赋给 with 语句中的 as 所指向的变量,其中as result也可省略,exit() 无论如何都一定会被执行,即使抛出异常。
with task as result:
codes
也可以使用try:finally进行上下文管理,但是with更优雅。
contextlib内置库,例如
@contextlib.contextmanager
def file_open(file_name, *args, **kwags):
# 相当于__enter__
file_handler = open(file_name, 'r')
#
yield file_handler
# __exit__方法
print('close file:', file_name, 'in __exit__')
file_handler.close()
return
import contextlib
# 自动调用
def close(self, ):
print('close str:', self.str)
def __init__(self, strssssss):
self.str = strssssss
print('init str:', strssssss)
def show(self):
print(self.str)
Stringggg = type('Stringggg', (object,), {'__init__': __init__, 'close': close, 'get_str': show})
with contextlib.closing(Stringggg(strssssss='12')) as Z:
pass
# contextlib.closing的实现方式
class closing(AbstractContextManager):
def __init__(self, thing):
self.thing = thing
def __enter__(self):
return self.thing
def __exit__(self, *exc_info):
self.thing.close()
go上下文管理
go使用context包进行上下文管理,
js上下文管理
js包括全局执行上下文、函数执行上下文、eval上下文
全局执行上下文
全局执行上下文只有一个,在客户端中一般由浏览器创建,也就是的window对象,可以通过this直接访问
函数执行上下文
每当一个函数被调用时都会创建一个函数上下文,每次调用,都会创建一个新的上下文,执行上下文栈是用来管理执行上下文的。在执行上下文创建好后,JavaScript引擎会将执行上下文压入到栈中,通常把这种用来管理执行上下文的栈称为执行上下文栈,又称调用栈。
eval上下文
与python类似
exec() 函数的返回值只会是 None,与执行语句的结果无关,所执行的语句中,当然如果包含 return 或 yield ,它们产生的值无法在 exec 函数的外部起作用。
eval() 函数的返回值是表达式的执行结果
两者的 globals 和 locals 参数,起到的白名单的作用,限定命名空间的范围,可防止作用域内的数据被滥用。