Generators
easyrpc can proxy registered generators & async generators with the same constraints as registered functions.
Note
input arguments / return values should be pickable objects
Like registered functions, normal generators are converted into async generators at the proxy and must be iterated over using 'async for' or await generator.asend(None)
EasyRpcServer
#server
from fastapi import FastAPI
from easyrpc.server import EasyRpcServer
server = FastAPI()
easy_server = EasyRpcServer(server, '/ws/easy', server_secret='abcd1234')
@easy_server.origin(namespace='private')
def private_generator(work: dict):
for item in work:
yield item
@easy_server.origin(namespace='public')
async def public_generator(work: dict):
for item in work:
yield item
EasyRpcProxy
# client.py
import asyncio
from easyrpc.proxy import EasyRpcProxy
async def main():
private = await EasyRpcProxy.create(
'0.0.0.0',
8220,
'/ws/easy',
server_secret='abcd1234',
namespace='private'
)
public = await EasyRpcProxy.create(
'0.0.0.0',
8220,
'/ws/easy',
server_secret='abcd1234',
namespace='public'
)
# basic generator usage
private_generator = await private['private_generator'](
[1, 2, 'a', 'b', 3, 4]
)
async for item in private_generator:
print(f"async for {item}")
public_generator = await public['public_generator'](
[1, 2, 'a', 'b', 3, 4]
)
while True:
try:
result = await public_generator.asend(None)
print(f"asend result: {result}")
except StopAsyncIteration:
break
asyncio.run(main())