human/render/base_render.py
2024-11-01 20:38:57 +08:00

52 lines
1.2 KiB
Python

#encoding = utf8
import logging
import time
from abc import ABC, abstractmethod
from queue import Queue
from threading import Event, Thread
from utils import SyncQueue
logger = logging.getLogger(__name__)
class BaseRender(ABC):
def __init__(self, play_clock, context, type_, delay=0.02, thread_name="BaseRenderThread"):
self._play_clock = play_clock
self._context = context
self._type = type_
self._delay = delay
self._queue = SyncQueue(context.batch_size, f'{type_}RenderQueue')
self._exit_event = Event()
self._thread = Thread(target=self._on_run, name=thread_name)
self._exit_event.set()
self._thread.start()
def _on_run(self):
logging.info(f'{self._type} render run')
while self._exit_event.is_set():
self._run_step()
time.sleep(self._delay)
logging.info(f'{self._type} render exit')
def put(self, frame, ps):
self._queue.put((frame, ps))
def size(self):
return self._queue.size()
def pause_talk(self):
self._queue.clear()
def stop(self):
self._queue.clear()
self._exit_event.clear()
self._thread.join()
@abstractmethod
def _run_step(self):
pass