/// 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): boolean;