把阻塞函数丢线程池执行,避免卡 event loop。 sem 用于限流(避免 GPU / 模型被打爆)。
(fn, *a, sem: asyncio.Semaphore | None = None, **kw)
| 304 | |
| 305 | |
| 306 | async def run_blocking(fn, *a, sem: asyncio.Semaphore | None = None, **kw): |
| 307 | """ |
| 308 | 把阻塞函数丢线程池执行,避免卡 event loop。 |
| 309 | sem 用于限流(避免 GPU / 模型被打爆)。 |
| 310 | """ |
| 311 | loop = asyncio.get_running_loop() |
| 312 | call = functools.partial(fn, *a, **kw) |
| 313 | if sem is None: |
| 314 | return await loop.run_in_executor(EXECUTOR, call) |
| 315 | async with sem: |
| 316 | return await loop.run_in_executor(EXECUTOR, call) |
| 317 | |
| 318 | |
| 319 | def _generate_sync(model, audio_or_text, status_dict): |
no outgoing calls
no test coverage detected
searching dependent graphs…