Spaces:
Sleeping
Sleeping
File size: 1,323 Bytes
d3ebdae 1862b79 d3ebdae 1862b79 d3ebdae 1862b79 d3ebdae 1862b79 d3ebdae 1862b79 d3ebdae 1862b79 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import asyncio
import bittensor as bt
from .streamer import AsyncResponseDataStreamer
from .database import LogDatabase
from typing import List, AsyncIterator
from aiohttp.web import Request
class StreamManager:
def __init__(self, log_database_path: str = "requests_db.jsonl"):
self.log_database = LogDatabase(log_database_path)
async def process_streams(self, request:Request, streams_responses: List[AsyncIterator], stream_uids: List[int]):
lock = asyncio.Lock()
streamers = [AsyncResponseDataStreamer(async_iterator=stream, selected_uid=stream_uid, lock=lock) for stream, stream_uid in zip(streams_responses, stream_uids)]
completed_streams = await asyncio.gather(*[streamer.stream(request) for streamer in streamers])
lock.release()
bt.logging.info(f"Streams from uids: {stream_uids} processing completed.")
await self.log_database.add_streams_to_db(completed_streams)
# Gets the first stream that acquired the lock, meaning the first stream that was able to return a non-empty chunk
_, selected_stream = next(((streamer, completed_stream) for streamer, completed_stream in zip(streamers, completed_streams) if streamer.lock_acquired), None)
return selected_stream
|