Недавно делал быстрый прототип асинхронного приложения в котором требовалось вызывать много синхронного кода. Да, я знаю, что это не лучший дизайн, но нужно было быстрое решение на один процесс и без очередей. Поэтому я выполнял код в потоках.
Выглядело это примерно так:
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
Higher temperatures, more wet and dry extremes, and accelerating increase in mean sea levels are projected for Singapore and Southeast Asia by the end of the century. Details of Singapore’s Third National Climate Change Study (V3) at go.gov.sg/V3
The choices we make today will determine our future climate. We need every individual to care for the environment as a way of life, in order to build a liveable and #SustainableSG. Find out how you can make a difference at www.mse.gov.sg/policies/climate-change/climategamechanger
Year-end celebrations are different this year, but that doesn’t mean we can’t make this one as special as the last. Let’s make this season of giving an unforgettable and meaningful one, by caring for the environment, yourself and your loved ones. #SustainableSGhttps://go.gov.sg/nea-year-end-advisory-2020
🎶 Ooooo~ This is an S.O.S.! 🎶
Good deals may be tempting but just because it’s on discount doesn’t mean you have to buy it.
Reduce food wastage during the upcoming year-end festivities:
✅ Plan your meals and prep a shopping list
✅ Order only what you can finish
✅ Transform leftovers into new dishes
#SayYEStoWasteLess#SustainableSG
Happy International E-waste Day!
Your old electronics aren’t just clutter. They’re filled with critical raw materials that can power our green future. ♻️
Drop them off at an e-waste bin. Let’s keep those precious materials in the loop!
#RecycleRight#SustainableSG
Ready for Bloobin's eco-party? Let’s see if your paper items make the cut!
Learn more about what can or cannot be recycled at go.gov.sg/towards-zero-waste.
#RecycleRight#SustainableSG
Bloobin's throwing the hottest eco-bash in town. Are your plastic items on the guest list or blacklist?
When unsure, check go.gov.sg/towards-zero-waste.
#RecycleRight#SustainableSG
Serving your guests special cookies and drinks this festive period? Don’t forget those cookie and drink containers can be recycled. For drink containers, get rewarded when you bring them to the nearest ‘Recycle N Save’ Reverse Vending Machine! ☺
You may also choose the ‘no reward’ option – just like 1 in 5 people who recycle with us! Saving our environment for our future generations is the greatest reward. More information at https://recyclensave.sg
#RecycleRight#SustainableSG
Our actions today impact our world tomorrow, and it is up to us to make it a better one. Together, let’s work #TowardsZeroWaste and build a #SustainableSG.
If you’re still not sure how to start, check out the activities and challenges at www.gogreen.gov.sg/programmes/
Donate items in good condition to others who need them most. Your pre-loved treasures could be someone else's gift!
For suggestions on donation channels, visit go.gov.sg/donate-resale-repair-channels
#TowardsZeroWaste#SayYEStoWasteLess#SustainableSG