WorkArea#
- class consign.workarea.workarea.WorkArea(name: str = 'DEFAULT_WORK_AREA', *args, **kwargs)[源代码]#
基类:
object
WorkArea是consign的基石,负责规划Worker和协程
WorkArea
分离所有Worker
的工作区域,这可以有助于你分配资源以及更好的使用Worker
WorkArea
被设计成线程安全的,借助ContextVar
在每个线程中都拥有独立的值,其本质是threading.local
WorkArea
默认在导入此库时,创建默认的DEFAULT_WORK_AREA
变量作为默认工作地址,并置于builtins
中:这意味着你可以通过 直接访问
DEFAULT_WORK_AREA.get()
获取当前的工作区域
当然并不推荐,一旦你这样使用,你应当明白你想要做些什么,以及会造成那些影响
DEFAULT_WORK_AREA
是全局的统一的,依托ContextVar
可以实现在不同线程中不同的值
不同线程间修改不会出现相互影响
WorkArea
作为上下文管理器其实现的本质就是对DEFAULT_WORK_AREA
的修改和恢复WorkArea
会修改DEFAULT_WORK_AREA
的值来影响 ``Worker``的运行
WorkArea
本质是一个上下文管理器,但同时支持修饰器写法修饰器代码来源于ContextDecorator,写法相当于语法糖, 他们是相等的:
@cm() def f(): # Do stuff
def f(): with cm(): # Do stuff
WorkArea
的name
参数非常重要:你可以注意到
WorkArea
被same_name_singleton
修饰,same_name_singleton
是一个单例的修饰器(新版本,为了适配多进程,修饰器无法被序列化,所以改用元类进行单例,效果不变)
WorkArea
通过name
区分, 同名 的情况下只有一个WorkArea实例但值得注意的是:
即使是同一个单例
WorkArea
,也并不意味着WorkArea
成员变量old_work_area_queue
存放的值是相同的old_work_area_queue
的本质是被ContextVar
包裹的变量为了防止多线程中共用一个
WorkArea
导致的LifoQueue
顺序冲突old_work_area_queue
会在每个单独的线程中创建一个LifoQueue
,由线程共享,以此保证线程安全- 参数
name (str) –
WorkArea
的名字,同名WorkArea
是同一个实例, 默认是名字使用DEFAULT_WORK_AREA
小技巧
理论上能hash的值都能传入name
为了减少意料之外的事情发生,建议输入是str
Methods Summary
__call__
(func)适配修饰器写法的实现
返回名为
DEFAULT_WORK_AREA
默认的WorkArea
Methods Documentation