Недавно делал быстрый прототип асинхронного приложения в котором требовалось вызывать много синхронного кода. Да, я знаю, что это не лучший дизайн, но нужно было быстрое решение на один процесс и без очередей. Поэтому я выполнял код в потоках.
Выглядело это примерно так:
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
Did you manage to catch these pastel-coloured altocumulus clouds at sunset?
When the sun is at a low angle on the horizon, sunlight travels across a longer distance through the atmosphere before reaching our eyes. As a result, blue colours are scattered by atmospheric particles, leaving behind brilliant hues of pink, orange and yellow.
📷: peiqiitohh #SGWeathergrams#WeatherWednesday
If you were in the Newton area on 25 May, you may have spotted this huge woolly blanket in the sky!
This blanket of dense clouds was formed as the top of a cumulonimbus cloud collapsed following strong thunderstorms across Singapore earlier that morning.
Named “cirrus spissatus”, these rarer upper atmosphere clouds are thicker and denser, and would block out the sun. The Latin word “spissatus” in its name describes its thicker appearance.
📷 Photo by _quietude__ #SGWeathergrams#WeatherWednesday
The mesmerising patterns formed by these beautiful stratocumulus clouds, seem to be reminding us to keep a safe distance from each other as we go about our daily activities. Tag us in your #SGWeathergrams on Instagram so that we can share your beautiful captures with others! #WeatherWednesday
📷: infectiousj
Hello Halo! Did you spot it this afternoon? These faint coloured rings encircling the sun are formed by the refraction of the light through ice crystals in high-level clouds under relatively clear conditions. #SGWeathergrams#SGWeather
While an impending thunderstorm looms, blue skies and fluffy clouds shine through in the distance. Tag us in your #SGWeathergrams posts on Facebook & Instagram so we can share it on #WeatherWednesdays. :)
📷: siewjunjie
#WeatherWednesday#throwback to the sunrise on 17 Jun, when we were greeted by this beautiful scattering of cirrocumulus stratiformis clouds.
The Latin word “stratiformis” means “stretched out”, referring to its irregular, dotted, blanket-like appearance.
📷 Photo by knifematchneedle #SGWeathergrams