先确认发送的是副本还是所有权
处理 Flux Art 图片的自建网页工具,可能把耗时操作交给 Worker,随后发现主线程原来的缓冲区不能继续用。这不一定是图片损坏,可能是代码选择了转移所有权。复制与转移会产生不同的后续使用规则,不能只凭两边都有变量名就认为两边都持有可用数据。本文讨论自己的前端实现,不宣称平台提供线程处理能力,也不把界面更流畅当成素材交付已经正确。
把资源所有者写进任务记录
建议记录任务编号、素材版本、当前资源所在上下文、是否允许复制、预计回传什么以及谁负责结束。发送后仍需主线程读取的输入,应在设计阶段选择明确的副本或其他来源,而不是转移后再尝试访问失效对象。文件本身、解码图像、像素缓冲与输出文件不是同一个对象,逐项说明用途,避免把一个类型的转移规则套到整个素材包。原始素材保留策略与工作缓冲清理分开。
转移列表不代替消息内容
MDN 说明,ArrayBuffer 等可转移对象交接资源后,原上下文的对应缓冲会分离;可转移资源还需通过消息的数据结构让接收方能够取得,不能只把它放进 transfer 列表。TypedArray 视图本身与其底层缓冲也应区别处理。不要为了省复制而随意转移仍被其他视图共用的底层缓冲,否则其他使用者也会受到影响。下表用于确认每一步的实际所有权。
| 资源阶段 | 谁可以使用 | 需要核对 |
|---|---|---|
| 转移之前 | 当前明确所有者 | 是否存在共享视图 |
| 发送转移消息 | 接收方按消息取得 | 数据与转移列表对应 |
| 发送之后 | 原缓冲不再按原样使用 | 分离状态与替代来源 |
| 结果回传 | 新的接收所有者 | 任务编号和版本 |
| 用户换图 | 只接管当前结果 | 旧任务结束记录 |
| Worker异常 | 按失败流程恢复 | 源文件与队列状态 |
离屏画布同样需要明确交接
OffscreenCanvas 可以用于把部分绘制工作放到 Worker,但具体功能支持需在目标环境验证。转移后应让接收方按约定处理画布,主线程继续负责交互与状态,不假定同一资源可以由两边同时随意操作。跨源读取限制、输入安全和内存预算仍然存在,线程变化不等于取得新权限。若环境不支持所需路径,提供经过验证的替代流程,而不是静默忽略处理后报告导出成功。
回传结果绑定输入版本
每条请求和返回都带任务编号与素材版本,主线程只接受仍属于当前操作的结果。用户换图后旧 Worker 结果到达,应按旧任务结束,不覆盖新预览或导出引用。若回传也转移了缓冲,Worker 端随后同样不能继续把它当作自己的可用资源。建议把任务完成、资源交还和界面接管分别记清,避免一边回收一边还有另一个异步操作依赖原对象。
用共享视图与换图测试边界
假设甲任务转移一个像素缓冲,主线程仍有另一个视图指向它;同时用户选了乙图。这是假设故障场景,不是真实平台性能测试。应验证主线程不会再读取已转移缓冲,甲的晚到结果不会覆盖乙。再测试 Worker 报错和提前结束,确认原始文件仍可恢复、界面不会无限等待。成功样本需核对输出内容,而不是只看 Worker 是否发回了一个完成字符串。
限制排队,避免把卡顿搬到后台
将计算放进 Worker 不代表内存和队列无限可用。建议限制同时在途任务,明确替换、取消与排队策略,用户快速换图时不要积累所有旧版本的完整缓冲。终止 Worker 与正常清理协议不同,依赖它的任务必须得到明确失败状态。不能把 Worker 叫作可防御任意恶意文件的资源沙箱;对不可信输入和高资源任务,仍需独立的格式校验、预算与受控处理环境。
交付记录看内容和状态,不只看速度
建议记录支持检测、复制或转移方式、发送前后可用状态、返回版本以及实际输出可读性。性能数据若没有测量就保持未知,不编造提升比例,也不把示例并发数当通用推荐。验收覆盖目标浏览器、正常完成、过期结果与异常退出,并确认原始素材未被覆盖。若输出经过重新编码,按新版本目标核对;原始字节不再相同不能单独证明错误,但必须有明确转换说明。
资料与接口范围
技术依据核对于2026年11月9日:资源转移见 https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Transferable_objects ,离屏画布见 https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas 。任务编号与所有权表是本文工程建议。Flux Art 生成结果可用于商业用途,输入权利和商品真实性另行核验;接口入口为 https://flux-art.net/zh/openapi 。取得图片后的线程与资源管理由接入方负责,不将本例说成平台速度或并发能力承诺。