WorkArea#
- class consign.workarea.workarea.WorkArea(name: str = 'DEFAULT_WORK_AREA', *args, **kwargs)[源代码]#
基类:
objectWorkArea是consign的基石,负责规划Worker和协程
WorkArea分离所有Worker的工作区域,这可以有助于你分配资源以及更好的使用WorkerWorkArea被设计成线程安全的,借助ContextVar在每个线程中都拥有独立的值,其本质是threading.localWorkArea默认在导入此库时,创建默认的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默认的WorkAreaMethods Documentation