如何检测 pywikibot 中的 maxlag 异常
How to detect maxlag exception in pywikibot
我正在开发一个维基百科机器人来分析编辑贡献。不幸的是,完成单个 运行 需要数小时,并且在此期间维基百科的数据库复制延迟 — 在 运行 期间的某个时刻 — 肯定会超过 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 次编辑,所以重新运行从一开始就是很多倒退。
我在谷歌上搜索了执行此操作的示例(检测错误并重试),但没有找到任何有用的信息。
正在将评论中的先前对话转换为答案。
解决此问题的一种可能方法是 try/catch 错误并重做导致错误的代码。
但是,pywikibot 已经在内部为我们做了这件事! Pywikibot,默认情况下会尝试重试每个失败的 API 调用 2 次,如果您使用它生成的默认值 user-config.py
。我发现在我的案例中增加以下配置可以解决问题:
- 最大延迟 = 20
- retry_wait = 20
- max_retries = 8
maxlag
是根据 Maxlag parameter 的文档建议增加的参数,尤其是当您在短时间内进行大量写入时。但是,retry_wait
和 max_retries
配置在其他人写了很多东西的情况下很有用(就像我的情况:我的脚本只是从 wiki 读取的)。
我正在开发一个维基百科机器人来分析编辑贡献。不幸的是,完成单个 运行 需要数小时,并且在此期间维基百科的数据库复制延迟 — 在 运行 期间的某个时刻 — 肯定会超过 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 次编辑,所以重新运行从一开始就是很多倒退。
我在谷歌上搜索了执行此操作的示例(检测错误并重试),但没有找到任何有用的信息。
正在将评论中的先前对话转换为答案。
解决此问题的一种可能方法是 try/catch 错误并重做导致错误的代码。
但是,pywikibot 已经在内部为我们做了这件事! Pywikibot,默认情况下会尝试重试每个失败的 API 调用 2 次,如果您使用它生成的默认值 user-config.py
。我发现在我的案例中增加以下配置可以解决问题:
- 最大延迟 = 20
- retry_wait = 20
- max_retries = 8
maxlag
是根据 Maxlag parameter 的文档建议增加的参数,尤其是当您在短时间内进行大量写入时。但是,retry_wait
和 max_retries
配置在其他人写了很多东西的情况下很有用(就像我的情况:我的脚本只是从 wiki 读取的)。