【问题标题】:Set timeout for connection to service设置连接到服务的超时
【发布时间】:2017-08-30 16:19:45
【问题描述】:

我有一项服务,我的代码尝试使用 API 连接到它:

import my_srvice_api

它没有任何超时机制,如果服务未运行,我的代码会一直等待,我想尝试在超时后引发异常,我该怎么做:

timeout = 3
try:
     obj = my_service_api.connect()
except TimeoutException as e:
     print("service my_service start")

【问题讨论】:

  • 只导入服务不会发生任何事情,除非您在函数中运行代码或通过实例化对象。如果您想为连接设置timeout(我认为可能已经有一些内置方法),您需要将您的连接置于循环中并在达到限制时退出。 try-except 基本上是用于处理异常,例如,如果您想处理相应的连接错误等。对于超时,您最好考虑一个带条件的循环。
  • @Kasramvd 你的权利,那是我的错。我改了。
  • 这里有一个类似的问题stackoverflow.com/questions/21965484/…
  • 如果connect 被阻止,我不确定你能做什么(除了修改它并添加对超时的支持)。另一种(丑陋的)可能性是在单独的线程中调用它,如果该线程没有在 timeout 秒内结束,则强制结束它。
  • 是的,我浏览过那个页面,但不幸的是没有任何明显的弹出:(

标签: python timeout


【解决方案1】:

我添加了这个装饰器(基于this 帖子)及其作品。感谢所有参与此问题的人。

import threading
import sys
class TimeoutError(Exception): pass

def timelimit(timeout):
    def internal(function):
        def internal2(*args, **kw):
            class Calculator(threading.Thread):
                def __init__(self):
                    threading.Thread.__init__(self)

                def run(self):
                    try:
                        function(*args, **kw)
                    except:
                        pass

            c = Calculator()
            c.start()
            c.join(timeout)
            if c.isAlive():
                raise TimeoutError
        return internal2
    return internal

然后我将这个装饰器添加到我的函数中:

@timelimit(2)
def time_out_api():
    obj = my_service_api.connect()

try:
    time_out_api()
except TimeoutError as e:
    print("service my_service start")
    exit(0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2022-06-16
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多