Как обнаружить исключение maxlag в pywikibot

Я занимаюсь разработкой бота из Википедии для анализа редактируемых материалов. К сожалению, для выполнения одного прогона требуются часы, и в течение этого времени задержка репликации базы данных Википедии - в какой-то момент во время прогона - обязательно превысит 5 секунд (значение maxlag по умолчанию). Рекомендация в параметре API maxlag состоит в том, чтобы обнаружить ошибку задержки, сделать паузу на 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'])

Но тогда перезапуск вкладов для пользователя кажется ужасно неэффективным. У некоторых пользователей есть 400000 правок, поэтому повторный запуск с самого начала является большим отступлением.

Я поискал примеры таких действий (обнаружение ошибки и повторная попытка), но ничего полезного не нашел.

1 ответ

Решение

Преобразование предыдущего разговора в комментариях в ответ.

Один из возможных способов решения этой проблемы - попытаться / отловить ошибку и повторить часть кода, которая вызвала ошибку.

Но Pywikibot уже делает это внутренне для нас! Pywikibot по умолчанию пытается повторить каждый неудачный вызов API 2 раза, если вы используете значение по умолчанию user-config.py это порождает. Я обнаружил, что увеличение следующих конфигов делает свое дело в моем случае:

  • maxlag = 20
  • retry_wait = 20
  • max_retries = 8

maxlag Этот параметр рекомендуется увеличивать в соответствии с документацией параметра Maxlag, особенно если вы выполняете большое количество операций записи за короткий промежуток времени. Но retry_wait а также max_retries конфиги полезны в случае, если кто-то еще много пишет (как в моем случае: мои сценарии только что прочитаны из вики).

Другие вопросы по тегам