上下文(Context)和超时(Timeout)
2 分钟阅读
原文:https://go-rod.github.io/i18n/zh-CN/#/context-and-timeout
收录该文档时间:
2024-11-21T08:08:39+08:00
上下文(Context)和超时(Timeout)
在 Golang 中,我们通常使用 Context 来终止长时间运行的任务。 Rod 使用 Context 来处理 IO 阻塞操作的取消(通常是因为超时)。 你需要特别注意这一问题。
如果你对 Context 不熟悉,请先阅读 了解 Context。
取消
例如下面的代码会创建一个空白页面并访问 “github.com”:
| |
现在假设我们想要在 MustNavigate 花费多于 2 秒时中断它。 在 Rod 中我们可以这样实现:
| |
我们使用 page.Context 创建了 page 的一个浅克隆。 当我们调用 cancel 时,由 pageWithCancel 发起的所有子操作都会被取消,不仅仅是 MustNavigate。 原 page 不会受到影响,如果我们使用它来调用操作,它们将不会被取消。
Rod 的此种风格和 Golang 标准库中的 Request.WithContext 很类似。
同时由于 pageWithCancel 和 page 是相互独立的,由 page 触发的操作不会受到取消的影响。
| |
超时
上面的示例只是给操作设置超时的一种方式。 在 Golang 中,超时通常只是取消的一种特例。 鉴于它十分实用,所以我们提供了一个简单的方法来实现它,也就是 Timeout。 上面的代码可以简化为:
| |
page.Timeout(2 * time.Second) 相当于之前的 pageWithCancel。 不只是 Page,Browser 和 Element 也都有相同的 context 帮助函数。
取消超时
如果你想在操作后继续使用相同的实例, 你可以使用 Page.CancelTimeout 函数来取消超时:
| |
判断超时
那么我们如何知晓一个失败的操作是否是因为超时了呢? 在 Golang 中超时通常是一种异常。 这并不是 Rod 特有的。 对于先前的代码,我们可以像这样判断超时:
| |
这里我们使用了 rod.Try 来包裹可能抛出超时异常的函数。
我们在异常处理里有更多这方面的讲解。