线程和asyncio API库

时间:2016-11-20 07:15:19

标签: python python-asyncio aiohttp

在Python中,我正在尝试为连接的设备创建API。我希望可用于线程(使用请求)和异步应用程序(使用aiohttp)。 我想出的是在装饰器中包装requestsaiohttp的get方法。这个装饰器在init传递,API调用使用传递的装饰器显式包装。

它有效,但我想知道其他人如何看待这种方法?有没有更好的方法,或者我以后会遇到问题?

任何帮助表示赞赏!

def threaded_gett(function):
    # The threaded decorator
    def wrapper(*args, **kwargs):
        url, params = function(*args)
        response = requests.get(url, params)
        _json = response.json()
        return function.__self__.process_response(_json)

    return wrapper

def async_gett(function):
    # The async decorator
    def wrapper(*args, **kwargs):
        url, params = function(*args)
        try:
            resp = yield from function.__self__.session.get(url, params=params)
        except Exception as ex:
            lgr.exception(ex)
        else:
            _json = yield from resp.json()
            yield from resp.release()
            return function.__self__.process_response(_json)

    # wrapping the decorator in the async coroutine decorator.
    wrapper = asyncio.coroutine(wrapper)
    return wrapper


class ThreadedApi(BaseApi):
    def __init__(self,threaded_gett):
        Base.__init(self,threaded_gett)


class AsyncApi(BaseApi):
    def __init__(self,async_gett):
        Base.__init(self,async_gett)


class BaseApi():
    def __init__(self,get_wrapper):
        self.status = get_wrapper(self.status)

    def status(self):
        return <status path>

1 个答案:

答案 0 :(得分:0)

您的代码不完整,但是,该方法可能在简单的情况下工作(当.process_response()非常通用并且可以应用于所有API调用时)。