CoroutineWorker#

class consign.CoroutineWorker(work_area_name: str = 'DEFAULT_WORK_AREA', *, work_area=None)[源代码]#

基类:object

CoroutineWorker协程Worker,CoroutineWorker能够以并发的方式执行特定的协程函数,是所有Worker的基石

CoroutineWorker 可以将 控制权切换以实现并发的效果

CoroutineWorker 的使用方法通常是 loop_work 阻塞并完成当前队列中的全部内容

如果你使用 CoroutineWorker 在多线程/进程环境下,那么 loop_work(forever=False) 在切换很快时是不可信的

这是由于队列qsize不确定性 以及框架的获取提交导致的

小技巧

通常在多线程下使用 loop_work(forever=True) 或者重复 while True 使用 loop_work(forever=False)

loop_work会把当前线程 阻塞 并作为一个 临时的worker 去工作

使用的是 当前进程 去工作,是 单线程 的,所以任何阻塞的函数都会导致阻塞。

例子

some_coroutine()

cw = CoroutineWorker()
cw.loop_work()
参数
  • work_area_name (str) – WorkArea 的名字,CoroutineWorker 会通过名字获取对应的 WorkArea

  • work_area (WorkArea) –

    work_area是显式参数,需要显式调用

    可以直接指定 WorkArea ,如果直接指定,会跳过 work_area_name 的查找过程

抛出

AssertionError – 当传入参数 work_area_name 无法被找到时抛出

Methods Summary

loop_work(*[, time_out, forever])

loop_work 阻塞并完成当前队列中的全部内容 或者 收到停止信号

qsize()

获得 WorkArea 队列中的大概数量

submit_work(*args)

提交任务到 WorkArea 队列

work_once([time_out])

CoroutineWorker 获取一次 WorkArea 队列中的内容并执行一次

Methods Documentation

loop_work(*, time_out=0.1, forever=True)[源代码]#

loop_work 阻塞并完成当前队列中的全部内容 或者 收到停止信号

警告

在多线程/进程环境下

forever参数为False时需要考虑 队列qsize的不确定性

小技巧

通常在多线程下使用 loop_work(forever=True) 或者重复 while True 使用 loop_work(forever=False)

参数
  • time_out – 等待 WorkArea 队列获取内容的等待超时时长

  • forever

    是否永久阻塞

    如果 forever 为False,那么 loop_work 会考虑队列的 qsize 是否<=0

    如果队列的 qsize <=0,那么退出循环

    如果你需要指定某个任务完成并阻塞,那么建议使用 wait 来确保完成优于直接使用 forever =True

返回

None

抛出

ValueError – 当参数 time_out 不正确时抛出

qsize()[源代码]#

获得 WorkArea 队列中的大概数量

警告

由于多线程或者多进程的上下文,这个数字是不可靠的。

请注意,这可能会在Unix平台上引起 NotImplementedError ,如 macOS ,因为其上没有实现 sem_getvalue() 。

返回

获得 WorkArea 队列中的大概数量

抛出

NotImplementedError – 能会在Unix平台上引起 NotImplementedError ,如 macOS ,因为其上没有实现 sem_getvalue()

submit_work(*args)[源代码]#

提交任务到 WorkArea 队列

不建议外部调用, 如果调用需要明白自己正在做什么

参数

args

按照规定 WorkArea 队列中是只应当put一个定义好的tuple

其格式为(yield_value, generator, receipts)

这里因为不向外调用,所以使用可变参偷了个懒,就无需再手动创建tuple

返回

None

抛出

Full – 当 WorkArea 队列存放满时触发

work_once(time_out=None)[源代码]#

CoroutineWorker 获取一次 WorkArea 队列中的内容并执行一次

任意一种情况返回都会视作一次Work

参数

time_out – 等待 WorkArea 队列获取内容的等待超时时长

返回

返回bool类型

False 意味着收到了约定的结束信号

True 表示正常结束Work

抛出
  • Empty – 当 WorkArea 队列为空时阻塞时长超过参数 time_out 时抛出

  • ValueError – 当参数 time_out 不正确时抛出