2016-08-16 8 views
1

編集貢献を分析するWikipediaボットを開発中です。残念ながら、1回の実行に時間がかかっており、その間に実行中のある時点でWikipediaのデータベース複製の遅延—が発生します。—は、5秒(デフォルトの最大遅延値)を超えてください。 API's maxlag parameterの推奨事項は、遅延エラーを検出し、X秒間停止して再試行することです。pywikibotのmaxlag例外を検出する方法

しかし、私がやっているすべてはで貢献を読んで:

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

エラーを検出し、それを再開するためにどのように?

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

しかし、その後、ユーザーのための貢献を再起動すると恐ろしく非効率です:

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. 

そのコード行でスローされた例外をキャッチするために私に発生します。これは誤りです。何人かのユーザーには400,000件の編集があるので、最初から再実行することは多くの逆行です。

私はこれを行って(エラーを検出して再試行して)グーグルで探そうとしましたが、役に立たないものは何も見つかりませんでした。

+0

トレースバックのエラーは、コードにその行がないときに( '' attrs = usr.getprops() '')、その行がありません(不一致と思われる)。例外は 'usr.contributions()'のループの内側かループが実行される前にスローされますか? – AbdealiJK

+0

@AJK:* contributions *ループの内部にあるようです。 – wallyk

+0

その場合、そのコードを捕まえて再試行しても問題ないでしょうか?貢献リスト全体を再度引っ張る必要はないので、私はスクリプトで使用しているhttps://pypi.python.org/pypi/retryを提案しています – AbdealiJK

答えて

2

コメント内の前の会話を回答に変換します。

これを解決するには、エラーをキャッチしてエラーを引き起こしたコードを再実行する方法があります。

しかし、pywikibotはすでにこれを内部的に行っています! Pywikibotはデフォルトでuser-config.pyを使用している場合、デフォルトで失敗したAPI呼び出しを2回再試行します。

  • maxlag = 20
  • retry_wait = 20
  • MAX_RETRIES = 8

maxlagが応じて増加することを推奨パラメータです:私は、次のconfigsを増加させることが私の場合にはトリックを行うことがわかりました特に、短い時間内に大量の書き込みを行っている場合は、Maxlag parameterのドキュメントを参照してください。しかし、retry_waitmax_retriesの設定は、他の誰かがたくさん書いている場合に役立ちます(私の場合、私のスクリプトはwikiから読み込んだだけです)。

+0

はい、私のスクリプトはほとんどすべての読み込みです。約450,000の読取りのうち、書込みは1つしかありません。分析の要約です。 – wallyk

関連する問題