- introduce locking to prevent same plot being generated together by multiple request
- use asyncio to_thread to offload plotting