Недавно делал быстрый прототип асинхронного приложения в котором требовалось вызывать много синхронного кода. Да, я знаю, что это не лучший дизайн, но нужно было быстрое решение на один процесс и без очередей. Поэтому я выполнял код в потоках.
Выглядело это примерно так:
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
🔠
🔠
🔠
🔠
🔠
🔠В новом году мы с вами еще не виделись, давайте исправлять!
У нас есть для вас 3 квеста!
1 - дожить до субботы, 2 и 3 - поволонтёрить на полезных мероприятиях
С утра в субботу предлагаем поучаствовать в подготовке компостных ям-траншей и прилегающей территории к последующему приему органики в Ботсаду, а днём в Ковчеге поиграть в сортировку крышечек по цветам на скорость!* И там, и там пригодится помощь 7-10 волонтёров
♻
* Мы вместе собрали очень много крышечек от пластиковых бутылоки теперь хотим сделать из этих крышечек красивую мозаику (#reuse) в одной из армянских школ. Дизайн мозаики разработает известный художник Арман Степанян. Для реализации нам необходимо рассортировать собранные крышечки по цвету
Ждем вас 21 января на одном или сразу двух мероприятиях!
🕚 11:00
📍 Ботанический сад, центральный вход, ул. Грачья Ачаряна
🛠 задачи: обрезка кустарников, перенос камней, уборка мусора
🕒 15:00
📍 ресурсный центр Ковчега, ул. Павстоса Бузанда 1/3
🛠 задача: сортировка пластиковых крышечек по цветам
Также просимподдержать нас, отправив пожертвование на комфортную сумму сюда
➡️
➡️
➡️
5471280030147752 (Ардшинбанк)
IVAN DIVILKOVSKIY
2200700168433976 (Тинькофф)
As we prepare for Christmas, let's transform and reuse our old decor for a fresh festive look.
Instead of buying new decorations, wrapping paper and cards, we can:
🎄 Paint a fresh coat on old ornaments
🎁 Reuse empty food jars or cookie tin cans as gift boxes
📱 Swap Christmas paper cards for heartfelt e-greetings
How are you getting creative with upcycling and recycling this Christmas? Share your tips in the comments below.
#TowardsZeroWaste#3Rs#Reduce#Reuse#Recycle
Our 2023 Wrapped is in!
'Bringing Your Reusable Bag for Shopping' is the chart-topping single we all need.
From reusable essentials to recycling mastery, we've built an eco-habit playlist that's pure chart green. Top tracks include 'Reusable Bag Groove', 'Recycling Rhythm', and 'Energy-Saving Melody'.
Fellow eco-warriors, let’s keep this #SustainableSG chart-topper habit going strong!
#TowardsZeroWaste#BYOB#BringYourOwnBag#BringYourOwn#BYO#3Rs#Reduce#Reuse#Recycle#EnergyEfficiency
Что это такое своп и шеринг группы («swap» и “sharing” в переводе с англ. “обмен”) ?
⠀
🍀это обмен ненужными, но хорошими вещами. Свопы проходят в виде фримаркета: вы приносите ненужную вам вещь, а забирайте нужную или вовсе ничего не забираете. Главный принцип свопа — никаких денег #nomoney
🍀 можно делиться информацией о ненужных вещах и договариваться об обмене в шеринг-группах или чатах в соцсетях.
⠀
⠀
🍀🍀🍀
#foodsharing#sharing#sobirator#собиратор#собиратормосква#своп#swap#свопмосква#обмен#медшеринг#шеринг#отдамдаром#отдамдароммосква#reuse#реюз#зоошеринг#zoosharing