将人造丝和 Tokio 混合用于娱乐和(头发)脱落

主要观点:一些 Rust 库难以混合使用,如 async 运行时tokio和数据并行库rayon,作者通过实践深刻体会到了这一点。
关键信息:

  • [Meilisearch v1.6]添加了与 OpenAI 交互生成嵌入的向量存储功能,使用reqwesttokio运行时。
  • 几天后收到[issue #4361],是由于在 Meilisearch 的文档索引操作中同时使用了tokiorayon导致的恐慌。
  • 深入研究发现是在rayon::spawn内部的block_on调用中初始化tokio运行时,导致了“异步rayon三明治”问题。
  • 具体过程是多个并发提取作业通过rayon::spawn启动,线程在不同运行时之间切换导致冲突。
  • 经验教训是希望有静态验证方式来避免这种情况,作者先发布了修复措施,后用ureq替代reqwest
    重要细节:
  • tokio的“当前线程”运行时用于发送 HTTP 请求并发处理错误。
  • 索引步骤大量使用rayon线程池。
  • 恐慌错误在特定条件下出现,难以重现。
  • 解决方法是避免在block_on中调用rayon,或使用异步通道通信替代混合使用。
阅读 11
0 条评论