HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 03.11.2021, 19:12
laiser
Участник форума
Регистрация: 21.12.2013
Сообщений: 181
С нами: 6522707

Репутация: 83
По умолчанию

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

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


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

  #2  
Старый 03.11.2021, 20:53
iAmerican
Постоянный
Регистрация: 17.02.2014
Сообщений: 611
С нами: 6438231

Репутация: 133


По умолчанию

Цитата:
Сообщение от 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('Процессы завершены')


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

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

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

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

 
Ответить с цитированием

  #3  
Старый 03.11.2021, 21:24
laiser
Участник форума
Регистрация: 21.12.2013
Сообщений: 181
С нами: 6522707

Репутация: 83
По умолчанию

Цитата:
Сообщение от 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)
 
Ответить с цитированием

  #4  
Старый 04.11.2021, 09:45
iAmerican
Постоянный
Регистрация: 17.02.2014
Сообщений: 611
С нами: 6438231

Репутация: 133


По умолчанию

Цитата:
Сообщение от 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
(
)
)
 
Ответить с цитированием

  #5  
Старый 04.11.2021, 14:19
pomidorq
Участник форума
Регистрация: 17.04.2020
Сообщений: 184
С нами: 3197792

Репутация: 83
По умолчанию

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

  #6  
Старый 04.11.2021, 16:40
laiser
Участник форума
Регистрация: 21.12.2013
Сообщений: 181
С нами: 6522707

Репутация: 83
По умолчанию

Цитата:
Сообщение от SOLO WARRIOR  

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

  #7  
Старый 04.11.2021, 23:24
pomidorq
Участник форума
Регистрация: 17.04.2020
Сообщений: 184
С нами: 3197792

Репутация: 83
По умолчанию

Цитата:
Сообщение от laiser  

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



Предыдущая тема Следующая тема

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.