AsyncWorker#

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

基类:CoroutineWorker

AsyncWorker异步协程Worker,AsyncWorker能够创建线程以应对耗时的阻塞IO,基于CoroutineWorker

AsyncWorker 可以将 耗时的事情 分配给许多线程去处理,得以实现异步

参见

当然,如果你使用 chain_reaction ,那么他依旧还是顺序执行的

所以如果性能有更高要求,建议灵活使用 wait

AsyncWorker 的使用方法通常是 init_thread 创建线程,很少且不建议使用 loop_work

如果你使用 AsyncWorker ,那么 loop_work(forever=False) 在切换很快时是不可信的

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

小技巧

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

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

所以如果 AsyncWorker 不使用 init_thread 直接使用 loop_work 其实和 CoroutineWorker 效果是 相同的

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

AsyncWorker 创建的线程默认是 守护线程 ,如果你的程序没有阻塞一路到exit的话,可能导致协程任务异常被终止

所以在 非cmd 下,最好使用 while True 或者 loop_work(forever=True) 去阻塞,或者设置参数选择生成非守护线程。

例子

some_coroutine()

aw = AsyncWorker()
using_thread_num = 5
# name_iter 传入为None的时候,默认使用uuid去生成名字
aw.init_thread(using_thread_num, name_iter=(f"DEFAULT_WORK_AREA_{i}" for i in range(using_thread_num)))

# 如果程序主进程没有其他内容,那么需要你使用阻塞,可以使用while或者Worker的loop_work
some_loop()
参数
  • work_area_name (str) – WorkArea 的名字,AsyncWorker 会通过名字获取对应的 WorkArea

  • work_area (WorkArea) –

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

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

抛出

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

Attributes Summary

thread_list

在获取thread_list时,同时检测并删除__thread_list中已经关闭的线程

Methods Summary

clear_dead_thread()

一般不建议外部调用

create_thread([name, daemon])

创建一个持续运行的线程,用于对协程函数进行执行

init_thread(create_num[, name_iter, daemon])

可以一次初始化多个线程

submit_thread_stop_flag()

向对应 WorkArea 提交约定的结束信号

Attributes Documentation

thread_list[源代码]#

在获取thread_list时,同时检测并删除__thread_list中已经关闭的线程

警告

注意这个处理会同步修改到__thread_list

返回的List并不是副本而是某种’引用’

返回

存放线程的列表

Methods Documentation

clear_dead_thread()[源代码]#

一般不建议外部调用

遍历列表并判断线程是否存活

如果线程不存活,那么从列表中删除此线程

返回

None

create_thread(name=None, daemon=True)[源代码]#

创建一个持续运行的线程,用于对协程函数进行执行

参数
  • name (str) – 创建的线程名, 如果为None,则使用uuid创建

  • daemon (bool) – 是否守护线程

返回

创建的线程对象

init_thread(create_num, name_iter=None, daemon=True)[源代码]#

可以一次初始化多个线程

是对 create_thread 的上层封装

参数
  • create_num (int) – 创建对应线程的数量

  • name_iter

    生成器或者容器,如果没有默认使用传递 None 即使用uuid命名

    警告

    没有对 name_iter 长度做校验 但 name_iter 长度应该跟create_num相同,避免出乎意料的结果

  • daemon (bool) – 创建的是否是守护线程

返回

submit_thread_stop_flag()[源代码]#

向对应 WorkArea 提交约定的结束信号

警告

约定的结束信号不一定能立马结束,因为队列中可能还有其他内容

返回