worker_thread
简介
提供gs线程池功能,可以把一些独立的工作分发到不同的线程中处理,不阻塞当前线程
需求
有些基于ffi实现的接口或者一些io相关的外部函数,如果直接在默认的并行协程调度器中调用会阻塞,会导致调度器的线程耗尽,所以希望有一个worker_thread的框架,可以把任务抛到另外的线程处理,当前协程走正常的pending流程,自己切出,把并行调度器的线程分给其他协程使用,当前协程进入sleep
状态, 等待协程池处理完成后返回, 可以获得处理结果
应用场景
各个协程都可能执行,且可能会导致当前线程卡很久且无法将当前协程pending的操作,比如数据库读写,文件读写等操作
对比
与copool
的区别:
两者目标不同,worker_thread是为了防止并行调度器的os线程耗尽,copool的目的是防止协程过于频繁创建销毁
使用示例
// 获取线程池 worker
import pkg.worker_thread;
object workers = worker_thread.create_worker("work", 10);
// 将函数传入线程池, 并等待
mixed res = workers.run((: run_func :));
run_func
为需要并行的函数, res
为run_func
的返回值
PS: 当前协程会进入休眠状态
将函数传入连接池, 即可实现函数的并行
PS: 函数必须是可以并行的, 也就是说函数是 parallel
或者函数所在的对象是parallel
组件接口
worker.gs
A worker object for executing task in multiple threads
函数原型 | 函数作用 |
---|---|
void set_warn_time(float wait_warn_time, float exec_warn_time) | 设置超时时间 |
mixed run(function func, ...) | 把一个任务抛到工作线程中执行,会等待执行完成(永久等待) |
mixed run_timeout(float timeout, function func, ...) | 把一个任务抛到工作线程中执行,会等待执行完成,带超时 |
map get_worker_info() | 获取工作线程全局信息 |
void dump() | 显示调试信息,任务列表详情 |
void stop(bool wait_all_finish) | 停止worker的工作 |
void debug_log_for(string path, int duration) | 写一段时间日志记录性能 |
worker_thread.gs
函数原型 | 函数作用 |
---|---|
object create_worker(string name, mixed para) | 创建一个worker对象 |