2016-08-16 2 views
1

Я разрабатываю бот Википедии для анализа вкладов редактирования. К сожалению, для завершения одного прогона требуется несколько часов, и за это время задержка репликации базы данных Википедии — в какой-то момент во время прогона — наверняка превысит 5 секунд (значение по умолчанию maxlag). Рекомендация в API's maxlag parameter заключается в обнаружении ошибки задержки, паузе в течение X секунд и повторной попытке.Как обнаружить исключение maxlag в pywikibot

Но все, что я делаю, читая вклады с:

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 изменений, поэтому повторное использование этого с самого начала - это откат.

У меня есть googled для примеров этого (обнаружение ошибки и повторная попытка), но я не нашел ничего полезного.

+0

Ошибка в трассировке находится на 'attrs = usr.getprops()', в то время как ваш код не имеет этой строки (кажется, что это некоторая несоответствие). Исключено ли исключение внутри цикла над 'usr.contributions()' или до того, как цикл запущен? – AbdealiJK

+0

@AJK: Кажется, что внутри петли * вклады *. – wallyk

+0

В этом случае, если вы поймаете и повторите этот код, все должно быть хорошо? Поскольку весь список взносов не нужно вытягивать снова. Я бы предложил https://pypi.python.org/pypi/retry, который я использую в своих сценариях. – AbdealiJK

ответ

2

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

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

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

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

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

+0

Да, мой скрипт почти все читает. Из примерно 450 000 чтений есть только одна запись: сводка анализа. – wallyk