Артём Шумейко
@artemshumeiko
28 39 4.4K
5
23
gather)while True + asyncio.gather и у них со временем сильно росла оперативка, и они не понимали почему — приходилось убивать контейнер и поднимать заново. А дело было в том, что разработчик не учел, что в gather при падении одной таски все остальные продолжают работать! В итоге накапливался снежный ком из задач, который постепенно сжирал память процесса.И вот такие баги случаются обычно на проде, когда локально у тебя вроде все ок работает, а при реальной нагрузке начинает тормозить/падать.
15
RUN от CMD EXPOSE в DockerfileCMD от ENTRYPOINT
8
Какой вывод: утечки памяти бывают не только на бэкенде, но и на фронтенде, особенно если у вас SSR с кэшированием. И ещё — иногда можно какое-то время жить на костыле, пока не станет совсем больно или пока не выбесит настолько, что сядешь и наконец разберёшься.
17
8
22
8
10
10
— комментарии нужны, это же комьюнити
46
13
А потом я начал ходить на собеседования в крупные компании и понял, что ожидания немного разошлись с реальностью.
— и то, и другое
102
5

35
26
6
13
class UnitOfWork:
def __init__(self):
self.session = async_session_maker()
async def __aenter__(self):
self.users = UserRepository(self.session)
self.orders = OrderRepository(self.session)
return self
async def __aexit__(self, exc_type, *args):
if exc_type:
await self.rollback()
await self.session.close()
async def commit(self):
await self.session.commit()
async def rollback(self):
await self.session.rollback()async def create_order(user_id: int, items: list):
async with UnitOfWork() as uow:
user = await uow.users.get(user_id)
order = await uow.orders.create(user, items)
await uow.commit()
return ordersession.add(user)
# session запомнила: "надо вставить user"
user.name = "Артём"
# session запомнила: "надо обновить user"
session.delete(order)
# session запомнила: "надо удалить order"
session.commit()
# session сгенерировала INSERT, UPDATE, DELETEsession.execute(), когда мы просто экзекьютим какой-то запрос, а не используем ORM-магию алхимии с отслеживанием объектов (всякие add, delete, flush, refresh).DBManager или TransactionManager, т.к. это честнее отражает суть — это удобная прослойка для управления транзакциями и доступа к репозиториям, не более.uow.users.get() вместо импорта класса/экземпляра репозитория каждый раз from some.other.folder.repo.user import UserRepository или дичи по типу помещения нужных репозиториев внутрь __init__ сервиса)
— использую похожую обертку
35
30
Платформа использует файлы cookie для авторизации и сохранения настроек. Продолжая работу, вы соглашаетесь с нашей Политикой использования cookie.