• python contextmananger装饰器与with


    如果想自定义一个类或者函数使用with语句,除了在类中自己定义__enter__()方法和__exit__()方法外,还可以使用contextmananger装饰器。

    contextmananger装饰器将yield之前的部分当做__enter__()方法,将yield之后的部分当做__exit__()方法。

    
    
    import requests
    import time
    import signal
    from contextlib import contextmanagerclass TimeoutException(Exception):
    pass
    
    
    @contextmanager
    def time_limit(seconds):
        def signal_handler(signum, frame):
            raise TimeoutException, "Timed out!"
        signal.signal(signal.SIGALRM, signal_handler)
        signal.alarm(seconds)
    # yield之前的代码当做__enter__()方法
    try: yield

    # yield之后的部分当做__exit__()方法
    finally: signal.alarm(0) while True: try: # limit the execution time of function with time_limit(1): requests.post(url, data={"a": 1}, timeout=1.1) # requests.post(url, data, verify=False) time.sleep(3) except TimeoutException, msg: print "Timed out!" # print msg raise TimeoutException, "Time out!"

    上述代码功能和下面的代码相同

    import requests
    import time
    import signal
    
    url = "http://127.0.0.1:8000/acceptpost/"
    
    
    # simple one
    
    def signal_handler(signum, frame):
        raise Exception("Timed out!")
    
    
    signal.signal(signal.SIGALRM, signal_handler)
    signal.alarm(1)   # 1 seconds
    try:
        req = requests.post(url=url, data={"a": 1})
        time.sleep(10)
    except Exception, msg:
        print "Timed out!"
    signal.alarm(0)
    time.sleep(1)
  • 相关阅读:
    【数据中心】大二层网络
    数通ARP协议
    数通链路聚合技术
    【数据中心】VXLAN技术
    数通交换机的数据平面、控制平面、管理平面
    数通交换机环路问题
    数通VRRP协议
    数通以太网交换机工作原理
    数通堆叠技术
    查看机器位数
  • 原文地址:https://www.cnblogs.com/buxizhizhoum/p/8243848.html
Copyright © 2020-2023  润新知