Создание ассинхронных функций

laiser

Известный
Автор темы
184
90
Всем привет, с ассинхронностью еще плохо знаком, поэтому пол дня ломаю себе мозг(
Мне нужно через бота запустить функцию, которая запустит еще функции, 1-3 штуки
И после того, как все функции завершились, мне нужно продолжить код
Вот что у меня сейчас:

Код:
start = 0
for i in range(stream):
    stop = start + len(tokens[i::stream])
    if tokens[start:stop]:
        self._task = asyncio.create_task(self._job(tokens[start:stop], i), name=str(user_id))
    start = stop
print('Процессы завершены')

Подскажите, что мне нужно вписать перед принтом, чтобы принт сработал тольпо после того, как все потоки завершились.
 

iAmerican

Известный
Друг
615
257
Всем привет, с ассинхронностью еще плохо знаком, поэтому пол дня ломаю себе мозг(
Мне нужно через бота запустить функцию, которая запустит еще функции, 1-3 штуки
И после того, как все функции завершились, мне нужно продолжить код
Вот что у меня сейчас:

Код:
start = 0
for i in range(stream):
    stop = start + len(tokens[i::stream])
    if tokens[start:stop]:
        self._task = asyncio.create_task(self._job(tokens[start:stop], i), name=str(user_id))
    start = stop
print('Процессы завершены')

Подскажите, что мне нужно вписать перед принтом, чтобы принт сработал тольпо после того, как все потоки завершились.
Асинхронщина создана не для таких задач.

То что у тебя вырвано из контекста , так сделать не получится. Описывай более подробно или кидай полностью готовый код.
Но , вероятнее всего, тебе не нужен асинхронный код.

В принципе , если я тебя правильно понял , то у тебя должно выйти что-то типо этого.
1635958911134.png
 
Последнее редактирование:

laiser

Известный
Автор темы
184
90
Асинхронщина создана не для таких задач.

То что у тебя вырвано из контекста , так сделать не получится. Описывай более подробно или кидай полностью готовый код.
Но , вероятнее всего, тебе не нужен асинхронный код.

В принципе , если я тебя правильно понял , то у тебя должно выйти что-то типо этого.
Посмотреть вложение 120578
Вот мой код, как я писал уже, что я вызываю эту функцию через бота, а он у меня ассинхронный, и в процессе работы отправляется смс в телегу.
Пробовал через threading, 1й поток нормально, а все последующие выдавали ошибки.
Код:
class Sendig:
    async def start(self, tokens, user_id, stream):
        self._user_id = user_id
        self._tokens = tokens
        self.st = stream

        tokens = tokens.split('\n')
        start = 0

        for i in range(stream):
            stop = start + len(tokens[i::stream])
            if tokens[start:stop]:
                await asyncio.sleep(1)
                self._task = asyncio.create_task(self._job(tokens[start:stop], i), name=str(user_id))
            start = stop


    async def _job(self, tokens, stream):
        await bot.send_message(self._user_id, f'Привет')
        # Код работы скрипты
        return True
А вот так вызывается:

Код:
@dp.message_handler(commands=['start'], state="*")
@dp.message_handler(text="Главное меню", state="*")
async def bot_start(message: types.Message, state: FSMContext):
    x = await Sendig().start('1\n2\n3', str(message.from_user.id), 3)
 

iAmerican

Известный
Друг
615
257
Вот мой код, как я писал уже, что я вызываю эту функцию через бота, а он у меня ассинхронный, и в процессе работы отправляется смс в телегу.
Пробовал через threading, 1й поток нормально, а все последующие выдавали ошибки.
Код:
class Sendig:
    async def start(self, tokens, user_id, stream):
        self._user_id = user_id
        self._tokens = tokens
        self.st = stream

        tokens = tokens.split('\n')
        start = 0

        for i in range(stream):
            stop = start + len(tokens[i::stream])
            if tokens[start:stop]:
                await asyncio.sleep(1)
                self._task = asyncio.create_task(self._job(tokens[start:stop], i), name=str(user_id))
            start = stop


    async def _job(self, tokens, stream):
        await bot.send_message(self._user_id, f'Привет')
        # Код работы скрипты
        return True
А вот так вызывается:

Код:
@dp.message_handler(commands=['start'], state="*")
@dp.message_handler(text="Главное меню", state="*")
async def bot_start(message: types.Message, state: FSMContext):
    x = await Sendig().start('1\n2\n3', str(message.from_user.id), 3)
Python:
import asyncio

class Sendig:

    def __init__(self,tokens, user_id):
        self._user_id = user_id
        self._tokens = tokens

    async def start(self):
        tasks = []

        for x in range(0,len(self._tokens)):
            task = asyncio.create_task(self._job(self._tokens[x]), name=str(self._user_id))
            tasks.append(task)
        
        await asyncio.gather(*tasks)

        print('end')

    async def _job(self, tokens):
        print(str(tokens),'uI:',str(self._user_id))

async def bot_start():

    arr = ['342343242e','12312314rw','12312321d21']
    sg = Sendig(arr,'123123123')
    await sg.start()

asyncio.run(bot_start())
 

laiser

Известный
Автор темы
184
90
Если хочешь несколько функций сразу то юзай Thread из threading, это единственный варик.
Да, я пытался, и этот вариант больше понравился, но в таком случае у меня не отправляются сообщения боту в других потоках, только в одном.