、私task.pyでなぜContextmanagerは実行時エラー 'throw()の後にジェネレータが停止しなかったのですか?私が持っている私のutility.pyで
@contextmanager
def rate_limit_protection(max_tries=3, wait=300):
tries = 0
while max_tries > tries:
try:
yield
break
except FacebookRequestError as e:
pprint.pprint(e)
if e._body['error']['message'] == '(#17) User request limit reached':
print("waiting...")
time.sleep(wait)
tries += 1
私が呼ぶ:
for date in interval:
with utility.rate_limit_protection():
stats = account.get_insights(params=params)
与えられた日付範囲のタスクをruningて後、Facebookのレート制限がで蹴ると、プログラムは300秒間待機した後、エラーが発生して失敗します。
File "/Users/kamal/.pyenv/versions/3.4.0/lib/python3.4/contextlib.py", line 78, in __exit__
raise RuntimeError("generator didn't stop")
RuntimeError: generator didn't stop
この 'rate_limit_protection'コンテキストマネージャが' with'文の本文を繰り返し実行することを期待していますか? 'と'はそれをしない。体は一度動く。 – user2357112
いいえいいえ.. for文を囲むforループがあります。 withステートメントは、forループの本文全体に対して1回実行されます。あなたのrate_limit_protection()関数の中にwhileループを持つことができないということを意味しますか? –
なぜループステートメント内にあるなら、with文がループ全体に対して一度実行されると思いますか? – user2357112