You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
import asyncio
|
|
import functools
|
|
import os
|
|
import random
|
|
import threading
|
|
|
|
from .asyncio.client import Client as AClient
|
|
from .asyncio.rpc import Rpc as ARpc
|
|
from .client import Client
|
|
from .rpc import Rpc
|
|
|
|
|
|
class RpcEndpoint:
|
|
def __init__(self, rpc, endpoints, get_endpoints, target):
|
|
self.__rpc = rpc
|
|
self.__endpoints = list(endpoints)
|
|
self.__get_endpoints = get_endpoints
|
|
self.__target = target
|
|
|
|
def refresh_endpoint(self):
|
|
return self.__get_endpoints(self.__target)
|
|
|
|
def __getattr__(self, name):
|
|
return functools.partial(getattr(self.__rpc, name), target=random.choice(self.__endpoints))
|
|
|
|
def set_endpoints(self, endpoints):
|
|
self.__endpoints = list(endpoints)
|
|
|
|
|
|
class AsyncHelper:
|
|
def __init__(self, uri):
|
|
self.bus = AClient(uri, f'python.dynamic.caller.{os.urandom(3).hex()}')
|
|
self.rpc = ARpc(self.bus)
|
|
self.locker = asyncio.Lock()
|
|
|
|
async def get_endpoints(self, target):
|
|
async with self.locker:
|
|
endpoints = {await self.rpc.get_worker(f'js.{target}.api') for _ in range(10)}
|
|
return endpoints
|
|
|
|
async def enter(self, target):
|
|
if not self.bus.connected:
|
|
async with self.locker:
|
|
if not self.bus.connected:
|
|
await self.bus.connect()
|
|
return RpcEndpoint(self.rpc, await self.get_endpoints(target), self.get_endpoints, target)
|
|
|
|
async def close(self):
|
|
await self.bus.disconnect()
|
|
|
|
|
|
class Helper:
|
|
def __init__(self, uri):
|
|
self.bus = Client(uri, f'python.dynamic.caller.{os.urandom(3).hex()}')
|
|
self.rpc = Rpc(self.bus)
|
|
self.locker = threading.Lock()
|
|
|
|
def get_endpoints(self, target):
|
|
with self.locker:
|
|
endpoints = {self.rpc.get_worker(f'js.{target}.api') for _ in range(10)}
|
|
return endpoints
|
|
|
|
def enter(self, target):
|
|
if not self.bus.connected:
|
|
with self.locker:
|
|
if not self.bus.connected:
|
|
self.bus.connect()
|
|
return RpcEndpoint(self.rpc, self.get_endpoints(target), self.get_endpoints, target)
|
|
|
|
def close(self):
|
|
self.bus.disconnect()
|