Недавно делал быстрый прототип асинхронного приложения в котором требовалось вызывать много синхронного кода. Да, я знаю, что это не лучший дизайн, но нужно было быстрое решение на один процесс и без очередей. Поэтому я выполнял код в потоках.
Выглядело это примерно так:
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
#Italia🇮🇹
#Regionali
#Marche
❓Come si vota nelle Marche?
Come nelle altre Regioni a statuto ordinario, i cittadini eleggono sia il Presidente della Giunta regionale, sia i membri del Consiglio regionale.
È proclamato Presidente il candidato che ottiene il maggior numero di voti validi.
I seggi del Consiglio regionale sono ripartiti in 5 circoscrizioni elettorali, corrispondenti alle Province (tra parentesi è indicato il numero di consiglieri spettanti a ciascuna):
- Ancona (9);
- Ascoli Piceno (4);
- Fermo (4);
- Macerata (6);
- Pesaro-Urbino (7).
In totale sono previsti 30 seggi, a cui si aggiunge quello riservato al Presidente della Giunta regionale.
L’assegnazione dei seggi avviene con metodo D’Hondt. Al candidato eletto Presidente spettano 18 o 19 seggi del Consiglio, da suddividere proporzionalmente tra le liste che lo hanno sostenuto. I seggi restanti vengono attribuiti alle altre liste.
Per le liste singole non è prevista alcuna soglia di sbarramento. Per le coalizioni, invece, la soglia è alternativa:
- del 5% dei voti validamente espressi;
- se la coalizione non raggiunge il 5%, è sufficiente che una lista al suo interno ottenga il 3%.
@TuttoElezioni
🇳🇱 La marche commémorative Régiment immortel a eu lieu à Amsterdam, rassemblant des dizaines de personnes venues de tous les coins des Pays-Bas, rapporte la correspondante de TASS.
#paysbas#marche
#Italia#Marche
Il sindaco di Civitanova Marche Fabrizio Ciarapica lascia #FI|EPP e aderisce a #FN|ESN: è il primo sindaco “futurista” di un comune italiano superiore.
@Osservatorioitaliano