AsyncWorker#
- class consign.worker.AsyncWorker(work_area_name: str = 'DEFAULT_WORK_AREA', *, work_area=None)[源代码]#
-
AsyncWorker异步协程Worker,AsyncWorker能够创建线程以应对耗时的阻塞IO,基于CoroutineWorker
AsyncWorker可以将 耗时的事情 分配给许多线程去处理,得以实现异步参见
当然,如果你使用
chain_reaction,那么他依旧还是顺序执行的所以如果性能有更高要求,建议灵活使用
waitAsyncWorker的使用方法通常是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会通过名字获取对应的WorkAreawork_area (WorkArea) –
work_area是显式参数,需要显式调用
可以直接指定
WorkArea,如果直接指定,会跳过work_area_name的查找过程
- 抛出
AssertionError – 当传入参数
work_area_name无法被找到时抛出
Attributes Summary
在获取thread_list时,同时检测并删除__thread_list中已经关闭的线程
Methods Summary
一般不建议外部调用
create_thread([name, daemon])创建一个持续运行的线程,用于对协程函数进行执行
init_thread(create_num[, name_iter, daemon])可以一次初始化多个线程
向对应
WorkArea提交约定的结束信号Attributes Documentation
- thread_list[源代码]#
在获取thread_list时,同时检测并删除__thread_list中已经关闭的线程
警告
注意这个处理会同步修改到__thread_list
返回的List并不是副本而是某种’引用’
- 返回
存放线程的列表
Methods Documentation
- create_thread(name=None, daemon=True)[源代码]#
创建一个持续运行的线程,用于对协程函数进行执行
- 参数
name (str) – 创建的线程名, 如果为None,则使用uuid创建
daemon (bool) – 是否守护线程
- 返回
创建的线程对象