Как поставить в поток функцию из другой асинхронной discord.py

Иннокентий

Новичок
Пользователь
Авг 6, 2020
4
0
1
У меня есть асинхронная функция A которая вызывается по event `on_raw_reaction_add`, в ней я пытаюсь поставить в поток другую асинхронную функцию B через модуль `threading. Функция B выполняет отправку сообщений в канал из своих аргументов.


Я плохо знаком с корутинами и потоками, но как я понимаю поставить в поток можно только асинхронную функцию. Я пробую это сделать в функции A без использования await исходя из логики прерывания, и получаю ошибку - `RntimeWarning: coroutine 'FarmZat' was never awaited`. Тогда я подставляю `await` к `FarmZ.start()` и при выполнении функции A снова получаю ошибку `TypeError: object NoneType can't be used in 'await' expression`.


Что я делаю не правильно и как нужно поставить функцию в поток? Буду благодарен за помощь, даже за ссылку в документацию.

**A**:

Python:
async def CreateFarmChannel(member: discord.Member):
    guild = bot.get_guild(880008097370865706)
    category = discord.utils.get(guild.categories, name="Фермы")


    channel = await guild.create_text_channel(f'⛏{member.name}', category=category)
    await channel.set_permissions(guild.default_role, read_messages=False)
    await channel.set_permissions(member, read_messages=True, send_messages=True)

    FarmZ = Thread(target=FarmZat, args=(member, channel))
    FarmZ.start()

**B:**

Код:
async def FarmZat(member: discord.Member, channel):
    await channel.send("Канал создан")
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
принципы асинхронности и многопоточности - это разные принципы программирования, и объединять их не имеет смысла...
вообще в асинхронности один поток, где используется принцип многозадачности...
принцип многозадачности заключается в том, что в одном процессе, в одном потоке, выполняется несколько задач параллельно...
параллельности конечно никакой нет, есть такое понятие как процессорное время, это значит что на каждую задачу есть определённое время, которое уделяет ей операционная система...
то есть вообще все процессы у вас в компе выполняются по очереди, с определённым таймингом, это и есть многозадачность, и это и есть основа асинхронного программирования...
вы пытаетесь объединить две концепции, это у вас вряд ли получится, да и не нужно...
что мешает запустить просто из одной асинхронной функции другую асинхронную функцию?
 

Форум IT Специалистов