Esempio n. 1
0
class RPCClient():
    """
    事件 rpc 客户端
    """

    endpoint = f'tcp://{settings.RPC_HOST}:{settings.RPC_PORT}'

    def __init__(self):
        """
        初始化
        """
        self._client = Client()

    def __getattr__(self, item):
        """
        设置调用传递到客户端
        """
        return getattr(self._client, item)

    def __enter__(self):
        """
        进入自动连接
        """
        self._client.connect(self.endpoint)
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        """
        退出时自动断开,并重置客户端
        """
        self._client.close()
Esempio n. 2
0
class ThreadingRPCClient(metaclass=SingletonMeta):
    """
    多线程安全的事件 rpc 客户端
    """

    endpoint = f'tcp://{settings.RPC_HOST}:{settings.RPC_PORT}'

    def __init__(self):
        """
        初始化
        """
        self._client = Client()
        self._lock = Lock()
        self._enter_num = 0

    def __getattr__(self, item):
        """
        设置调用传递到客户端
        """
        return getattr(self._client, item)

    def __enter__(self):
        """
        当进入的线程为 0 时,重置客户端并自动连接
        """
        with self._lock:
            if self._enter_num == 0:
                self._client = Client()
                self._client.connect(self.endpoint)
            self._enter_num += 1
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        """
        退出时自动断开,并重置客户端
        """
        with self._lock:
            self._enter_num -= 1
            if self._enter_num == 0:
                self._client.close()
        self._client = Client()