【问题标题】:How to detect maxlag exception in pywikibot如何在 pywikibot 中检测 maxlag 异常
【发布时间】:2016-08-16 17:04:37
【问题描述】:

我正在开发一个维基百科机器人来分析编辑贡献。不幸的是,完成一次运行需要数小时,在此期间,维基百科的数据库复制延迟(在运行期间的某个时间点)肯定会超过 5 秒(默认的 maxlag 值)。 API's maxlag parameter 中的建议是检测滞后错误,暂停 X 秒后重试。

但我所做的只是阅读以下内容:

usrpg = pywikibot.Page(site, 'User:' + username)
usr = pywikibot.User(usrpg)
for contrib in usr.contributions(total=max_per_user_contribs):
    # (analyzes contrib here)

如何检测错误并恢复它?这是错误:

WARNING: API error maxlag: Waiting for 10.64.32.21: 7.1454429626465 seconds lagged
Traceback (most recent call last):
  File ".../bot/core/pwb.py", line 256, in <module>
    if not main():
  File ".../bot/core/pwb.py", line 250, in main
    run_python_file(filename, [filename] + args, argvu, file_package)
  File ".../bot/core/pwb.py", line 121, in run_python_file
    main_mod.__dict__)
  File "analyze_activity.py", line 230, in <module>
    attrs = usr.getprops()
  File ".../bot/core/pywikibot/page.py", line 2913, in getprops
    self._userprops = list(self.site.users([self.username, ]))[0]
  File ".../bot/core/pywikibot/data/api.py", line 2739, in __iter__
    self.data = self.request.submit()
  File ".../bot/core/pywikibot/data/api.py", line 2183, in submit
    raise APIError(**result['error'])
pywikibot.data.api.APIError: maxlag: Waiting for 10.64.32.21:
    7.1454 seconds lagged [help:See https://en.wikipedia.org/w/api.php for API usage]
<class 'pywikibot.data.api.APIError'>
CRITICAL: Closing network session.

我突然捕捉到了那行代码中抛出的异常:

 raise APIError(**result['error'])

但随后为用户重新启动贡献似乎非常低效。一些用户有 400,000 次编辑,所以从头开始重新运行是很多倒退。

我已经搜索了执行此操作的示例(检测错误并重试),但我发现没有任何用处。

【问题讨论】:

  • 回溯中的错误在attrs = usr.getprops(),而您的代码没有该行(似乎有些不匹配)。异常是在循环内通过usr.contributions() 还是在循环运行之前抛出?
  • @AJK:它似乎在 contributions 循环内。
  • 在这种情况下,如果您捕获并重试该代码,应该没问题吧?因为整个贡献列表不需要再次拉取。我建议 pypi.python.org/pypi/retry 这是我在我的脚本中使用的
  • 看来,设置配置 maxlag = 20retry_wait = 20max_retries = 8 已经为我解决了这个问题。使用它,pywiibot 会更多地重试 API 调用,并且更持久地获取输出。对我来说,更改后甚至没有抛出错误。
  • @AJK:我之前从未详细查看过user-config.py。那里好像有各种有用的按钮和旋钮!

标签: pywikibot


【解决方案1】:

将先前在 cmets 中的对话转换为答案。

解决此问题的一种可能方法是尝试/捕获错误并重做导致错误的代码。

但是,pywikibot 已经在内部为我们完成了这项工作!如果您使用它生成的默认user-config.py,Pywikibot 默认会尝试重试每个失败的 API 调用 2 次。我发现在我的情况下增加以下配置可以解决问题:

  • 最大延迟 = 20
  • retry_wait = 20
  • max_retries = 8

maxlag 是根据Maxlag parameter 的文档建议增加的参数,特别是如果您在短时间内进行大量写入。但是,retry_waitmax_retries 配置很有用,以防其他人写了很多东西(我的情况是:我的脚本刚刚从 wiki 读取)。

【讨论】:

  • 是的,我的脚本几乎都是读取的。在大约 450,000 次读取中,只有一次写入:分析摘要。
  • 我因使用高于推荐的 5 的 maxlag 而被阻止,因此请注意这一点。
猜你喜欢
  • 2016-01-31
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
相关资源
最近更新 更多