2 回答

TA貢獻1789條經驗 獲得超10個贊
您沒有非常具體地說明超時和重試次數,或者成功的條件...但是,為簡單起見,假設您希望重試最多 5 次,重試間隔為 1,并且您希望繼續執行 500(或 5xx)以外的錯誤代碼。
然后你可以使用類似的東西:
import time
def sequence_of_requests(arg1, arg2):
yield request_a(arg1)
yield request_b(arg1, arg2)
for retries in range(5):
result = request_c(arg1, arg2)
if result.status_code < 500:
break
time.sleep(1)
yield result
如果達到最大重試次數,則只需返回上次收到的響應。如果獲得有效的響應,則脫離循環并返回良好的響應。
有一個小的低效率,因為如果你達到重試總數,你仍然會睡1秒,然后再返回值。您可以通過顯式管理變量并檢查循環中的限制來解決此問題。但是,對于如何管理放棄,您可能還有其他想法(例如,超時,而不是固定次數的重試),因此您應該調整該部分代碼以遵循對您有意義的邏輯。retries

TA貢獻1802條經驗 獲得超6個贊
您可以生成函數,而不是生成響應值本身,然后可以重復調用這些函數。函數的參數可以使用 應用。functools.partial
from functools import partial
def sequence_of_requests(arg1, arg2):
yield partial(request_a, arg1)
yield partial(request_b, arg1, arg2)
yield partial(request_c, arg1, arg2)
現在可以測試這些步驟:
generator_functions = sequence_of_requests()
r = next(generator_functions)()
assert r.status_code == 200
r = next(generator_functions)()
assert r.status_code == 204
# Repeatedly make the request until the expected status code is returned.
func_slow_request = next(generator_functions)
wait_for_status(404)(func_slow_request)
添加回答
舉報