///
import { MessagePort, Worker as NativeWorker, WorkerOptions } from "worker_threads";
/** 表示一个线程池 */
export declare class WorkerPool {
/** 获取在子线程执行的代码 */
readonly workerCode: string;
/** 获取创建子线程的附加选项 */
readonly workerOptions: WorkerOptions;
/** 获取允许创建的最大子线程数, 如果为 0 表示不启用线程 */
readonly size: number;
/**
* 初始化新的线程池
* @param worker 要在子线程执行的函数,函数不可使用闭包
* @param worker.data 由主线程发送的附加数据
* @param worker.context 子线程的上下文对象
* @param worker.return 返回回传给主线程的对象
* @param options 附加选项
*/
constructor(worker: (data: any, context: WorkerContext) => any, options?: WorkerPoolOptions);
/** 获取所有子线程 */
readonly workers: Worker[];
/** 正在排队的第一个任务,如果没有任务正在执行则为 `undefined` */
private _firstTask?;
/** 正在排队的最后一个异步任务,如果没有任务正在排队则为 `undefined` */
private _lastTask?;
/**
* 在子线程中执行任务
* @param data 传递给子线程的数据,数据的类型必须可复制
* @param transferList 要移动的内存对象,移动后当前线程将无法使用该对象,如果未设置,则对象将被复制到其它线程
*/
exec(data?: any, transferList?: (ArrayBuffer | MessagePort)[]): Promise;
/**
* 创建原生子线程
*/
protected createNativeWorker(): NativeWorker;
/**
* 在指定的子线程执行任务
* @param worker 要使用的子线程
* @param data 传递给子线程的数据,数据的类型必须可复制
* @param transferList 要移动的内存对象,移动后当前线程将无法使用该对象,如果未设置,则对象将被复制到其它线程
*/
private _execWorker;
/** 获取供子线程调用的全局函数 */
readonly functions?: {
[name: string]: (data: any, transferList: (ArrayBuffer | MessagePort)[], worker?: Worker) => any;
};
/**
* 当收到子线程的远程调用后执行
* @param name 要调用的函数名
* @param data 要调用的函数参数
* @param transferList 设置要移动的内存对象,移动后当前线程将无法使用该对象,如果未设置,则对象将被复制到其它线程
* @param worker 来源的子线程,如果是主线程则为 `undefined`
*/
protected onCall(name: string, data: any, transferList: (ArrayBuffer | MessagePort)[], worker?: Worker): any;
/** 关闭所有线程 */
close(): Promise;
}
/** 表示一个线程池的选项 */
export interface WorkerPoolOptions extends Omit {
/**
* 最大允许同时执行的线程数, 如果为 0 表示不启用多线程
* @default Math.ceil(require("os").cpus().length / 2)
*/
size?: number;
/** 供子线程调用的全局函数,在子线程中可以使用 `await this.call("name", ...)` 调用 */
functions?: {
[name: string]: (data: any, transferList: (ArrayBuffer | MessagePort)[], worker?: Worker) => any;
};
}
/** 表示一个子线程 */
export interface Worker extends NativeWorker {
/** 判断当前线程是否正在运行 */
running?: boolean;
}
/** 表示执行线程的上下文 */
export interface WorkerContext {
[key: string]: any;
/** 判断当前线程是否是主线程 */
isMainThread: boolean;
/** 由主线程发送的全局数据 */
workerData: any;
/**
* 调用主线程定义的函数
* @param name 要调用的函数名
* @param data 同时发送的数据,数据的类型必须可复制
* @param transferList 要移动的内存对象,移动后当前线程将无法使用该对象,如果未设置,则对象将被复制到其它线程
*/
call(name: string, data?: any, transferList?: (ArrayBuffer | MessagePort)[]): Promise;
/** 获取或设置本次要移动的内存对象,移动后当前线程将无法使用该对象,如果未设置,则对象将被复制到其它线程 */
transferList?: (ArrayBuffer | MessagePort)[];
}
/**
* 判断指定的对象是否可在线程之间传递
* @param obj 要判断的对象
* @see https://nodejs.org/api/worker_threads.html
*/
export declare function isStructuredCloneable(obj: any, _processed?: Set