bitbake: asyncrpc: Add context manager API

Adds context manager API for the asyncrcp client class which allow
writing code that will automatically close the connection like so:

    with hashserv.create_client(address) as client:
       ...

Rework the bitbake-hashclient tool and PR server to use this new API to
fix warnings about unclosed event loops when exiting

(Bitbake rev: 52226a7244968c8dad6f4ee9ccec57ac1979217a)

Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit d01d684a0f6398270fe35ed59b7d28f3fd9b7e41)
Signed-off-by: Steve Sakoman <steve@sakoman.com>
This commit is contained in:
Joshua Watt
2023-11-03 08:26:21 -06:00
committed by Steve Sakoman
parent f768ffb891
commit afe1706a77
3 changed files with 33 additions and 22 deletions

View File

@@ -56,25 +56,24 @@ def main():
nonlocal missed_hashes nonlocal missed_hashes
nonlocal max_time nonlocal max_time
client = hashserv.create_client(args.address) with hashserv.create_client(args.address) as client:
for i in range(args.requests):
taskhash = hashlib.sha256()
taskhash.update(args.taskhash_seed.encode('utf-8'))
taskhash.update(str(i).encode('utf-8'))
for i in range(args.requests): start_time = time.perf_counter()
taskhash = hashlib.sha256() l = client.get_unihash(METHOD, taskhash.hexdigest())
taskhash.update(args.taskhash_seed.encode('utf-8')) elapsed = time.perf_counter() - start_time
taskhash.update(str(i).encode('utf-8'))
start_time = time.perf_counter() with lock:
l = client.get_unihash(METHOD, taskhash.hexdigest()) if l:
elapsed = time.perf_counter() - start_time found_hashes += 1
else:
missed_hashes += 1
with lock: max_time = max(elapsed, max_time)
if l: pbar.update()
found_hashes += 1
else:
missed_hashes += 1
max_time = max(elapsed, max_time)
pbar.update()
max_time = 0 max_time = 0
found_hashes = 0 found_hashes = 0
@@ -174,9 +173,8 @@ def main():
func = getattr(args, 'func', None) func = getattr(args, 'func', None)
if func: if func:
client = hashserv.create_client(args.address) with hashserv.create_client(args.address) as client:
return func(args, client)
return func(args, client)
return 0 return 0

View File

@@ -126,6 +126,12 @@ class AsyncClient(object):
{'ping': {}} {'ping': {}}
) )
async def __aenter__(self):
return self
async def __aexit__(self, exc_type, exc_value, traceback):
await self.close()
class Client(object): class Client(object):
def __init__(self): def __init__(self):
@@ -176,3 +182,10 @@ class Client(object):
if sys.version_info >= (3, 6): if sys.version_info >= (3, 6):
self.loop.run_until_complete(self.loop.shutdown_asyncgens()) self.loop.run_until_complete(self.loop.shutdown_asyncgens())
self.loop.close() self.loop.close()
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
self.close()
return False

View File

@@ -344,9 +344,9 @@ def auto_shutdown():
def ping(host, port): def ping(host, port):
from . import client from . import client
conn = client.PRClient() with client.PRClient() as conn:
conn.connect_tcp(host, port) conn.connect_tcp(host, port)
return conn.ping() return conn.ping()
def connect(host, port): def connect(host, port):
from . import client from . import client