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 中:
  1. 这意味着你可以通过 直接访问 DEFAULT_WORK_AREA.get() 获取当前的工作区域

当然并不推荐,一旦你这样使用,你应当明白你想要做些什么,以及会造成那些影响

  1. 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

WorkAreaname 参数非常重要:

你可以注意到 WorkAreasame_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)

适配修饰器写法的实现

as_default()

返回名为 DEFAULT_WORK_AREA 默认的 WorkArea

Methods Documentation

__call__(func)[源代码]#

适配修饰器写法的实现

参数

func (function) – 被包裹的函数中的全部协程函数将会运行于此 WorkArea 的作用范围

static as_default()[源代码]#

返回名为 DEFAULT_WORK_AREA 默认的 WorkArea

as_default 将会去 builtins 中寻找 DEFAULT_WORK_AREA 变量并返回其中保存的 WorkArea

DEFAULT_WORK_AREA 变量一般会在导入库时被创建

如果没能找到,as_default 会创建 DEFAULT_WORK_AREA 包装并置入 builtins 并返回

返回

返回名为 DEFAULT_WORK_AREA 默认的 WorkArea