跳到主要内容

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为需要并行的函数, resrun_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对象