ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   Создание ассинхронных функций (https://forum.antichat.xyz/showthread.php?t=1407005)

laiser 03.11.2021 19:12

Всем привет, с ассинхронностью еще плохо знаком, поэтому пол дня ломаю себе мозг(

Мне нужно через бота запустить функцию, которая запустит еще функции, 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 03.11.2021 20:53

Цитата:

Сообщение от laiser

Всем привет, с ассинхронностью еще плохо знаком, поэтому пол дня ломаю себе мозг(
Мне нужно через бота запустить функцию, которая запустит еще функции, 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('Процессы завершены')



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

Асинхронщина создана не для таких задач.

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

Но , вероятнее всего, тебе не нужен асинхронный код.

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

https://forum.antichat.xyz/attachmen...54b0008ba3.png

laiser 03.11.2021 21:24

Цитата:

Сообщение от iAmerican

Асинхронщина создана не для таких задач.

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

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

Вот мой код, как я писал уже, что я вызываю эту функцию через бота, а он у меня ассинхронный, и в процессе работы отправляется смс в телегу.

Пробовал через 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 04.11.2021 09:45

Цитата:

Сообщение от laiser

Вот мой код, как я писал уже, что я вызываю эту функцию через бота, а он у меня ассинхронный, и в процессе работы отправляется смс в телегу.
Пробовал через 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
(
)
)


pomidorq 04.11.2021 14:19

Если хочешь несколько функций сразу то юзай Thread из threading, это единственный варик.

laiser 04.11.2021 16:40

Цитата:

Сообщение от SOLO WARRIOR

Если хочешь несколько функций сразу то юзай Thread из threading, это единственный варик.

Да, я пытался, и этот вариант больше понравился, но в таком случае у меня не отправляются сообщения боту в других потоках, только в одном.

pomidorq 04.11.2021 23:24

Цитата:

Сообщение от laiser

Да, я пытался, и этот вариант больше понравился, но в таком случае у меня не отправляются сообщения боту в других потоках, только в одном.

Значит ошибка в коде.


Время: 16:28