Недавно делал быстрый прототип асинхронного приложения в котором требовалось вызывать много синхронного кода. Да, я знаю, что это не лучший дизайн, но нужно было быстрое решение на один процесс и без очередей. Поэтому я выполнял код в потоках.
Выглядело это примерно так:
from fastapi.concurrency import run_in_threadpool
async def execute(data: DataRequest) -> DataResponse:
try:
result = await run_in_threadpool(sync_function, data)
return DataResponse(data=result)
except Exception as e:
return DataResponse(
error=str(e),
success=False,
)
В общем работает нормально. Для всех вызовов под капотом используется общий тредпул, всё работает предсказуемо.
Но потребовалось изменить количество запускаемых в пуле потоков (по умолчанию создается 40 воркеров).
Так как дело происходит с FastAPI, делается это через lifespan используя настройки anyio:
import anyio
@asynccontextmanager
async def lifespan(app: FastAPI):
limiter = anyio.to_thread.current_default_thread_limiter()
limiter.total_tokens = 100
yield
# если вдруг нужно вернуть обратно
limiter.total_tokens = 40
Зачем менять количество воркеров?
- уменьшить, если оперативки мало (один тред занимает ~8мб)
- увеличить чтобы выдержать нагрузку
Если есть предложения получше при тех же вводных - предлагайте😉
#async
名称:2007 台北音响大展 NRG+WAV 分轨
描述:
1. 爱江山更爱美人
2. 斯选卡布罗往事如昔
3. 荣耀经
4. Softly And Tenderly
5. L'enfant au Tambour
6. Mona Lisa
7. 四季歌
8. 为爱痴狂
9. 花好月圆
10. 漫步在云端
11. Whe The Gril In Your Arms
12. Interlude
13. When The Sun Comes Out
14. 告别时刻
15. 掌声响起来
链接:https://pan.quark.cn/s/bda88eb5fe3e
📁 大小:1.22GB
🏷 标签:#wav#无损音乐#音乐