python libtorrent 在使用磁力 URI 时我应该等待元数据多长时间?

Posted

技术标签:

【中文标题】python libtorrent 在使用磁力 URI 时我应该等待元数据多长时间?【英文标题】:python libtorrent How long should i wait for meta data while using magnet URI? 【发布时间】:2015-09-25 12:52:34 【问题描述】:

我正在尝试通过提供磁力 URI 从 DHT 下载元数据,但有时单个 URI 需要超过 5 分钟。

我正在使用这样的代码

while (not handle.has_metadata()):
    try:
        sleep(1)
    except KeyboardInterrupt:
        print("Aborting...")
        ses.pause()
        print("Cleanup dir " + tempdir)
        shutil.rmtree(tempdir)
        sys.exit(0)
ses.pause()
print("Done")

那么我需要等待多长时间才能等待元数据? 或者我可以在为新的磁铁 uri 创建新句柄以获取元数据时保持该句柄处于活动状态?

是否有超时设置或类似的设置?

更新:

我的意思是,有没有一个神奇的数字,比如说 X 分钟。 如果它不能在 X 分钟内获取元数据,那么它就不能在 24 小时内获取元数据。

或者是否有可能,它可以在 24 小时内获取,但不能在前 x 分钟内获取?

这究竟是如何工作的?

【问题讨论】:

最坏的情况是群体中没有人获得元数据/种子。我想我会无限期地等待数据,直到用户决定取消下载。 @Caramiriel 谢谢,但在最坏的情况下,最好在几个小时后再次检查,而不是无限期地等待?只是一个想法。这又提出了一个问题,需要多长时间才能到达群中的每个人? 我认为 borealid 解决了我想回答的问题。但可以肯定的是,最好保持它的外观,但不要阻止任何 UI。让它不时检查元数据是否可用。无论如何,它可能是一个简单的布尔值。 【参考方案1】:

没有时间点可以肯定地说永远不会获取元数据。

假设有一个人在他们的机器上拥有完整的信息。两年后,他们将打开 PC 并加入 swarm 和 DHT。

如果您等待两年,下载将成功。否则会失败。

你必须任意决定你愿意等待多长时间:没有失败的“保证”。

【讨论】:

感谢您的回答,可以说我愿意不时尝试检查元数据,但我必须保持它活跃多长时间?对不起,我的英语不好。我的意思是现在 10 分钟就够了,然后检查一下? @AMB 这种通用技术称为“轮询”。您轮询的次数越多,您知道任务是否完成的速度就越快,但您花费的 CPU 时间也就越多。这是一个没有绝对正确答案的滑动比例。【参考方案2】:

正如 Borealid 指出的那样,无法确定世界上不存在拥有元数据的人(但目前处于离线状态)。

如果您想知道某人现在(或多或少)是否有元数据,我的基本建议是您至少等待一个 DHT 宣布间隔。

有几个步骤需要成功:

    DHT 引导程序(查找 DHT 节点) DHT 宣布(寻找 BitTorrent 对等方) 连接到同行 具有具有元数据(并支持元数据扩展)的对等体。绝大多数同行都支持此扩展。

从技术上讲,每个步骤都可能有单独的超时。假设您已启动并与 DHT 建立了有效的连接,接下来的问题是确保向 DHT 的通告工作并完成。

每个15 minutes 的种子应该是announce to the DHT。它可以在 libtorrent 中配置,称为 dht_announce_interval。如果 DHT 存在一些问题导致它错过更新(例如,当您添加磁力链接时 DHT 没有完全引导),您可能需要再等待 15 分钟才能再次宣布。

要记住的另一件事是,在 libtorrent 中,DHT 公告试图随着时间的推移或多或少地均匀分布。这意味着添加磁力链接后,第一次尝试可能不会立即进行。

为了更确定是否有任何对等点,您还可以强制更新 DHT(在 torrent_handle 对象上调用 force_dht_announce())。如果您在几分钟内执行此操作(如果您还没有找到任何对等点),它也可能会解决导致第一次宣布失败的任何问题。

一旦你有一个连接的 bittorrent 对等点,你可以相当肯定 DHT 宣布成功(除非你从本地对等点发现中得到它,我想)。查看对等列表 (torrent_handle::get_peer_info()) 时,每个 peer_info 条目都有一个源标志字段,可以告诉您它是否来自 DHT。

一旦有了对等点,您可能需要等待一个 PEX 间隔 (60 seconds) 以确保在放弃之前有机会了解更多对等点,以防对等点本身没有元数据或没有发送。

没有简单的方法来判断对等点是否支持元数据或 pex 扩展,但如果它不支持扩展协议,它也不支持。你可以通过 peer_info::flags & peer_info::supports_extensions 来判断。

只要在标志字段中设置了 peer_info::connecting 或 peer_info::handshake 位,对等点可能只是一个随机 IP,它曾经是 swarm 的一部分。在这些位被清除之前,假设对等点还活着或存在是不安全的。

【讨论】:

谢谢,我怎么错过了这个答案,现在才注意到。

以上是关于python libtorrent 在使用磁力 URI 时我应该等待元数据多长时间?的主要内容,如果未能解决你的问题,请参考以下文章

libtorrent-rasterbar 无法使用磁力链接下载元数据

libtorrent 无法使用 VS2005 构建

如何在python中使用libtorrent的udp协议跟踪器协议

如何使用 python-libtorrent 下载特定文件

使用带有 python 绑定的 boost 在 osx 上构建 32 位版本的 libtorrent

Libtorrent,Python,如何设置下载速度