主要观点:一些 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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。