我目前有一个系统,使用
easy
API 和多线程来实现请求并行化。作为优化,通过共享接口使用共享连接缓存,并且CURL_LOCK_DATA_CONNECT
。
我知道,当使用
easy
接口时,每个连接池都与一个特定的句柄相关联。因此,如果句柄消失,关联的连接池也会消失。
使用共享连接缓存时,缓存项和句柄之间是否还存在关联?换句话说,当关联的句柄被销毁时,连接是否会从缓存中删除?或者共享连接缓存中的连接的生命周期完全独立于句柄吗?
不管怎样,我以后会切换到
multi
界面。
CURL_LOCK_DATA_CONNECT
选项 与共享对象一起使用时,连接缓存确实在不同的 easy
句柄之间共享。这样做的目的是实现跨不同简单句柄的连接重用,有效地汇集这些连接。
在此共享设置中,当
easy
句柄被销毁时,如果与该句柄关联的连接位于共享连接池中,则不会立即丢弃它们。它们仍可供其他 easy
句柄重用,具体取决于 libcurl
采用的连接重用策略,其中考虑了目的地、凭据等因素。
curl/curl
问题 4544:“CURL_LOCK_DATA_CONNECT
可能会导致多个线程上的连接并发访问”,已在curl 7.68.0(2019 年 12 月)中使用 Pr 4557 修复.
但是,需要注意的是,仅仅因为连接保留在池中,并不一定意味着它会无限期地保持活动状态。由于服务器关闭连接、网络问题等原因,池中未主动使用的连接可能会被关闭。
CURL_LOCK_DATA_CONNECT
附带curl 7.57.0(2017年11月)和PR 2043
可以看官方示例
shared-connection-cache.c
,它调用了lib/easy.c#curl_easy_cleanup()
和lib/share.c#curl_share_cleanup()
我没有看到“生命周期”,除了关闭连接,它确实清洁了简易手柄。
一般来说,转换到
multi
接口可能是有益的,因为它是专门为高效处理多个连接而设计的,并且您不需要自己管理线程。连接池和重用仍然与共享对象上的 CURL_LOCK_DATA_CONNECT
类似。