Ответы пользователя по тегу Асинхронное программирование
  • Почему цикл for блокирует асинхронное выполнение программы?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Ключевое слово await заставляет ожидать завершения всей функции и только потом происходит переход к следующей итерации.
    Если использовать asyncio.create_task, то создается и запускается фоновая задача - цикл продолжается после запуска этой асинхронной функции и не ждет ее завершения.

    хотя в функции pool_user нет ничего, что могло бы блокировать асинхронный цикл

    Во-первых, там есть подключение if await user.connect()
    Во-вторых, ты отправляешь сообщение если подключиться не удалось await bot.send_message

    Но в любом случае ты постоянно делаешь подключение, которое и блокирует выполнение функции
    Ответ написан
    3 комментария
  • Есть ли какой-нибудь способ конвертировать массив или коллекцию List в synchronizedCollection?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    SynchronizedCollection<T> - это легаси из .NET фреймворка, в современном рантмайме ты его не найдешь.
    Могу предложить использовать:
    - BlockingCollection<T>
    - Channel<T>

    Если есть возможность, то конвертируй задачу на Scatter/Gather манеру и необходимость в этих структурах данных отпадет.
    Ответ написан
    Комментировать
  • Как асинхронно использовать gui и несколько бесконечных циклов?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Для такого нужно запускать отдельные потоки.
    Во всех GUI приложениях всегда есть один главный поток, который используется для обработки пользовательского ввода (и только). Для фоновых работ надо использовать фоновые потоки. async/await в данном случае не подходит
    Ответ написан
    Комментировать
  • Python asyncio list does not processing asyncrounouslly because of what?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    В первом случае ты грубо говоря все запускаешь синхронно: синхронно итерируешься по списку, await'ишь - все последовательно

    Во втором случае, ты запускаешь множество асинхронных генераторов. Каждый запускается, пишет Started, достигает await и управление переходит следующему генератору. Т.е. получается - сначала все доходят до await (печатают Started), после ставятся в конец и, когда все Started уже написали, начинается исполнение того, что после await
    Ответ написан
  • Как обработать статус код 429 и избежать race condition при параллельных запросах?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Говорю сразу мьютекс мне не подходит, так как это уже не будет параллельно.


    С чего бы "уже не будет параллельно" ? Очень даже будет. По факту, при параллельных операциях всегда будет какая-нибудь блокировка, даже в Wait-Free алгоритмах, где используется CAS она есть, только на машинном уровне.

    Как можно реализовать такое поведение?


    Если не хочешь мьютекс (или другой блокирующий примитив), то используй CAS (Compare And Swap). Вот документация

    Идея слудующая:
    - хранишь где нибудь поле с этим прокси
    - при начале каждой операции сохраняешь старое значение прокси
    - когда получаешь 429, то CAS'ом меняешь, то что хранится на новое (сравниваешь со старым)
    Ответ написан
    2 комментария
  • Как запустить группу асинхронных задач так, чтобы при ошибке выполнения одной другие продолжили выполнение?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Обернуть каждую в другую таску, которая проглатывает все исключения.
    try {
    // Работа
    } catch (Exception) {
    // Пусто
    }
    Ответ написан
    Комментировать
  • Один connect при старте или connect-fetch-close при необходимости?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Используй пул соединений. В asyncpg он поддерживается.

    В доке есть
    Ответ написан
    1 комментарий
  • Как исправить ошибку в PostgrSQL(asyncpg)?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Ошибка в том, что ты не await'ишь user_exists в if
    @dp.message_handler(commands=['start'])
    async def bot_start(message: types.Message):
        if message.chat.type == "private":
            # Вот здесь ты не вставил await
            if not new_ton.user_exists(message.from_user.id):
                await new_ton.add_user(message.from_user.id)
        await message.answer(' Добро пожаловать', reply_markup=client_kb.main_buttons)


    @dp.message_handler(commands=['start'])
    async def bot_start(message: types.Message):
        if message.chat.type == "private":
            # А вот здесь сделал
            user_exists = await new_ton.user_exists(message.from_user.id)
            if not user_exists:
                await new_ton.add_user(message.from_user.id)
        await message.answer(' Добро пожаловать', reply_markup=client_kb.main_buttons)


    Вот так сделай
    @dp.message_handler(commands=['start'])
    async def bot_start(message: types.Message):
        if message.chat.type == "private":
            if not await new_ton.user_exists(message.from_user.id):
                await new_ton.add_user(message.from_user.id)
        await message.answer(' Добро пожаловать', reply_markup=client_kb.main_buttons)
    Ответ написан
    Комментировать