Как использовать Asyncio для запуска двух разных асинхронных функцийPython

Программы на Python
Anonymous
Как использовать Asyncio для запуска двух разных асинхронных функций

Сообщение Anonymous »

Я пишу сценарий, который использует API Graph для Microsoft для подключения и запроса пользовательских данных из Entra ID в Azure. У меня есть две разные функции, которые я пытаюсь использовать: одна, которая получает пользователей из указанной группы, и другая, которая извлекает отображаемое имя пользователя по значению его идентификатора. Если я использую asyncio.run() для запуска того или другого, оба будут работать без проблем. Но если я попытаюсь включить в свой скрипт оба одновременно, то получу ошибку на втором. Я все еще изучаю тонкости асинхронного программирования, поэтому не могу понять, почему я не могу заставить работать второй вызов asyncio.run().
У меня есть это код в моем основном скрипте, который выполняет функцию в другом скрипте:

Код: Выделить всё

async def get_all_group_members():
memberListAll = []
for group in groupList:
# print(f"We are trying to run group {group}")
results = await gq.get_group_user(group['GroupID'], graphServiceClient)
memberDict = {"GroupName":group["GroupName"], "GroupID":group["GroupID"], "MemberList":results}
memberListAll.append(memberDict)
return memberListAll
results = asyncio.run(get_all_group_members())
Определение get_group_user:

Код: Выделить всё

memberList = []
members = await graphServiceClient.groups.by_group_id(groupID).members.get()
if members and members.value:
for member in members.value:
user = await graphServiceClient.users.by_user_id(member.id).get()
if user:
memberList.append(user.display_name)
return memberList
Затем в моем основном сценарии у меня есть вторая функция, которая ссылается на другую функцию из второго файла сценария:

Код: Выделить всё

async def get_user_name():
results = await gq.get_user_by_id(member=member,graphServiceClient=graphServiceClient)
return results

results2 = asyncio.run(get_user_name())
Определение get_user_by_id:

Код: Выделить всё

user = await graphServiceClient.users.by_user_id(member).get()
print(user)
Если я закомментирую все для второй функции get_group_user, первая функция будет работать нормально. Если я закомментирую все для первой функции get_all_group_members, вторая функция будет работать нормально. Просто когда я действительно запускаю оба, второй терпит неудачу, и я не знаю, почему, поэтому не могу понять, как это исправить.
Почему я не могу вызвать asyncio. run() более одного раза в сценарии? Как мне изменить свой скрипт, чтобы я мог успешно запускать обе эти функции асинхронно и получать нужные мне данные?

РЕДАКТИРОВАТЬ (выяснил решение самостоятельно):
Чтобы иметь возможность запускать обе асинхронные функции, я создал еще одну асинхронную функцию, в которую я поместил обе другие функции, затем вызвал эту функцию, используя asyncio.run(). Я до сих пор не знаю, почему я не могу вызвать asyncio.run() два раза в одном и том же сценарии, чтобы это не вызвало проблем, но, по крайней мере, я могу двигаться вперед с этой проблемой, которую пытаюсь решить. . Вот как код выглядит сейчас:

Код: Выделить всё

async def get_all_group_members():
memberListAll = []
for group in groupList:
# print(f"We are trying to run group {group}")
results = await gq.get_group_user(group['GroupID'], graphServiceClient)
memberDict = {"GroupName":group["GroupName"], "GroupID":group["GroupID"], "MemberList":results}
memberListAll.append(memberDict)
return memberListAll

async def get_user_name():
member = ''
results = await gq.get_user_by_id(member=member,graphServiceClient=graphServiceClient)
return results

async def run_async_functions():
groupResults = await get_all_group_members()
usernameResults = await get_user_name()
return groupResults, usernameResults

groupResults, usernameResults = asyncio.run(run_async_functions())
После загрузки результатов обеих функций в groupResults и usernameResults я могу распечатать значения, а это значит, что я смогу взаимодействовать с ними на пути, который мне нужен, чтобы двигаться вперед.

Подробнее здесь: https://stackoverflow.com/questions/786 ... -functions

Вернуться в «Python»