主要观点:一些 Rust 库难以混合使用,如 async 运行时tokio和数据并行库rayon,作者通过实践深刻体会到了这一点。
关键信息:
- [Meilisearch v1.6]添加了与 OpenAI 交互生成嵌入的向量存储功能,使用
reqwest和tokio运行时。 - 几天后收到[issue #4361],是由于在 Meilisearch 的文档索引操作中同时使用了
tokio和rayon导致的恐慌。 - 深入研究发现是在
rayon::spawn内部的block_on调用中初始化tokio运行时,导致了“异步rayon三明治”问题。 - 具体过程是多个并发提取作业通过
rayon::spawn启动,线程在不同运行时之间切换导致冲突。 - 经验教训是希望有静态验证方式来避免这种情况,作者先发布了修复措施,后用
ureq替代reqwest。
重要细节: tokio的“当前线程”运行时用于发送 HTTP 请求并发处理错误。- 索引步骤大量使用
rayon线程池。 - 恐慌错误在特定条件下出现,难以重现。
- 解决方法是避免在
block_on中调用rayon,或使用异步通道通信替代混合使用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。