## Motivation Batching will require us to send tasks concurrently and queue them up. Our current infrastructure cannot handle that all. This PR gets us closer to this by allowing multiple tasks to be sent in parallel and then queuing up tasks. ## Changes Change Plan logic Make runner main into a class Add a "BatchGenerator" to which tasks can be submitted (although tasks are handled sequentially) and sent back through an MpSender. Refactor runner to accept tasks during generation Keep the generator threading Separate the runner into several files for better readability ## Test Plan ### Manual Testing Tested manually, needs a lot more automated testing. Cancellation still works on a single device. Needs checking on multiple devices. ### Automated Testing --------- Co-authored-by: Evan Quiney <[email protected]>
37 lines
911 B
Python
37 lines
911 B
Python
import asyncio
|
|
|
|
import pytest
|
|
from exo_pyo3_bindings import (
|
|
Keypair,
|
|
NetworkingHandle,
|
|
NoPeersSubscribedToTopicError,
|
|
PyFromSwarm,
|
|
)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_sleep_on_multiple_items() -> None:
|
|
print("PYTHON: starting handle")
|
|
h = NetworkingHandle(Keypair.generate())
|
|
|
|
rt = asyncio.create_task(_await_recv(h))
|
|
|
|
# sleep for 4 ticks
|
|
for i in range(4):
|
|
await asyncio.sleep(1)
|
|
|
|
try:
|
|
await h.gossipsub_publish("topic", b"somehting or other")
|
|
except NoPeersSubscribedToTopicError as e:
|
|
print("caught it", e)
|
|
|
|
|
|
async def _await_recv(h: NetworkingHandle):
|
|
while True:
|
|
event = await h.recv()
|
|
match event:
|
|
case PyFromSwarm.Connection() as c:
|
|
print(f"PYTHON: connection update: {c}")
|
|
case PyFromSwarm.Message() as m:
|
|
print(f"PYTHON: message: {m}")
|