使用 CURL_LOCK_DATA_CONNECT 时的连接生命周期

问题描述 投票:0回答:1

我目前有一个系统,使用

easy
API 和多线程来实现请求并行化。作为优化,通过共享接口使用共享连接缓存,并且
CURL_LOCK_DATA_CONNECT

我知道,当使用

easy
接口时,每个连接池都与一个特定的句柄相关联。因此,如果句柄消失,关联的连接池也会消失。

使用共享连接缓存时,缓存项和句柄之间是否还存在关联?换句话说,当关联的句柄被销毁时,连接是否会从缓存中删除?或者共享连接缓存中的连接的生命周期完全独立于句柄吗?

不管怎样,我以后会切换到

multi
界面。

libcurl
1个回答
0
投票

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
类似。

© www.soinside.com 2019 - 2024. All rights reserved.