AsyncWorker#
- class consign.worker.asyncworker.AsyncWorker(work_area_name: str = 'DEFAULT_WORK_AREA', *, work_area=None)[源代码]#
-
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中已经关闭的线程
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) – 是否守护线程
- 返回
创建的线程对象