นี่คือปัญหาของฉันในเรื่องนี้ retry
ฟังก์ชั่นต่อไปนี้รองรับคุณสมบัติดังต่อไปนี้:
- ส่งคืนค่าของฟังก์ชันที่เรียกใช้เมื่อสำเร็จ
- เพิ่มข้อยกเว้นของฟังก์ชันที่เรียกใช้หากพยายามหมด
- จำกัด สำหรับจำนวนครั้ง (0 สำหรับไม่ จำกัด )
- รอ (เชิงเส้นหรือยกกำลัง) ระหว่างความพยายาม
- ลองอีกครั้งหากข้อยกเว้นเป็นอินสแตนซ์ของประเภทข้อยกเว้นเฉพาะ
- การบันทึกที่ไม่จำเป็นของความพยายาม
import time
def retry(func, ex_type=Exception, limit=0, wait_ms=100, wait_increase_ratio=2, logger=None):
attempt = 1
while True:
try:
return func()
except Exception as ex:
if not isinstance(ex, ex_type):
raise ex
if 0 < limit <= attempt:
if logger:
logger.warning("no more attempts")
raise ex
if logger:
logger.error("failed execution attempt #%d", attempt, exc_info=ex)
attempt += 1
if logger:
logger.info("waiting %d ms before attempt #%d", wait_ms, attempt)
time.sleep(wait_ms / 1000)
wait_ms *= wait_increase_ratio
การใช้งาน:
def fail_randomly():
y = random.randint(0, 10)
if y < 10:
y = 0
return x / y
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.addHandler(logging.StreamHandler(stream=sys.stdout))
logger.info("starting")
result = retry.retry(fail_randomly, ex_type=ZeroDivisionError, limit=20, logger=logger)
logger.info("result is: %s", result)
ดูโพสต์ของฉันสำหรับข้อมูลเพิ่มเติม
range(100)
โดยไม่มีพารามิเตอร์แรก หากคุณใช้ Python 2.x คุณสามารถใช้งานxrange(100)
ได้สิ่งนี้จะสร้างตัววนซ้ำและใช้หน่วยความจำน้อยลง (ไม่ใช่ว่ามันมีวัตถุเพียง 100 ชิ้นเท่านั้น)