 |

03.11.2021, 19:12
|
|
Участник форума
Регистрация: 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('Процессы завершены')
Подскажите, что мне нужно вписать перед принтом, чтобы принт сработал тольпо после того, как все потоки завершились.
|
|
|

03.11.2021, 20:53
|
|
Постоянный
Регистрация: 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('Процессы завершены')
Подскажите, что мне нужно вписать перед принтом, чтобы принт сработал тольпо после того, как все потоки завершились.
Асинхронщина создана не для таких задач.
То что у тебя вырвано из контекста , так сделать не получится. Описывай более подробно или кидай полностью готовый код.
Но , вероятнее всего, тебе не нужен асинхронный код.
В принципе , если я тебя правильно понял , то у тебя должно выйти что-то типо этого.

|
|
|

03.11.2021, 21:24
|
|
Участник форума
Регистрация: 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)
|
|
|

04.11.2021, 09:45
|
|
Постоянный
Регистрация: 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
(
)
)
|
|
|

04.11.2021, 14:19
|
|
Участник форума
Регистрация: 17.04.2020
Сообщений: 184
С нами:
3197792
Репутация:
83
|
|
Если хочешь несколько функций сразу то юзай Thread из threading, это единственный варик.
|
|
|

04.11.2021, 16:40
|
|
Участник форума
Регистрация: 21.12.2013
Сообщений: 181
С нами:
6522707
Репутация:
83
|
|
Сообщение от SOLO WARRIOR
Если хочешь несколько функций сразу то юзай Thread из threading, это единственный варик.
Да, я пытался, и этот вариант больше понравился, но в таком случае у меня не отправляются сообщения боту в других потоках, только в одном.
|
|
|

04.11.2021, 23:24
|
|
Участник форума
Регистрация: 17.04.2020
Сообщений: 184
С нами:
3197792
Репутация:
83
|
|
Сообщение от laiser
Да, я пытался, и этот вариант больше понравился, но в таком случае у меня не отправляются сообщения боту в других потоках, только в одном.
Значит ошибка в коде.
|
|
|
|
 |
Предыдущая тема
Следующая тема
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|