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