Asyncio.gather: «Будущее для запроса с идентификатором x уже выполнено»Python

Программы на Python
Ответить
Anonymous
 Asyncio.gather: «Будущее для запроса с идентификатором x уже выполнено»

Сообщение Anonymous »

У меня возникла проблема: у меня есть несколько асинхронных задач, которые я объединяю в функцию сбора следующим образом:

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

async def get_daten(url, uri, maschine):
client = Client(url=url)
client.session_timeout = 30000
stueckzahl = None
try:
await client.connect()
idx = await client.register_namespace(uri)
stueckzahl_node = client.get_node(f"ns={idx};i=7")
stueckzahl = await client.get_values([stueckzahl_node])
stueckzahl = stueckzahl[0]
zeitpunkt = datetime.now()
await client.disconnect()
except OSError as e:
zeitpunkt = datetime.now()
# print("OSError")
except asyncio.exceptions.TimeoutError as e:
zeitpunkt = datetime.now()
print(f"TimeoutError: {maschine}, {url}")
except asyncio.exceptions.CancelledError as e:
zeitpunkt = datetime.now()
print(f"CancelledError: {maschine}, {url}")
except BadNotWritable as e:
zeitpunkt = datetime.now()
print(f"BadNotWritable: {maschine}, {url}, {e}")
print(await client.get_namespace_array())

return zeitpunkt, stueckzahl

tasks = []
for key in config:
maschine = config[key]
url = maschine['url']
uri = maschine['namespace']
tasks.append(get_daten(url, uri, maschine['MaschinenName']))

# Run all tasks concurrently
results = await asyncio.gather(*tasks)
Задачи устанавливают соединения с серверами и, следовательно, требуют большого количества операций ввода-вывода. Теперь в очень редких случаях я получаю такое сообщение (у меня есть почтовый скрипт, который предоставляет мне любой вывод моей программы в виде текста) без трассировки стека (трассировка стека обычно печатается для неперехваченных исключений, поэтому я предполагаю, что это не так). случай здесь):
"Будущее для запроса с идентификатором 4 уже выполнено"
Я не могу со 100% уверенностью определить, откуда оно взялось, потому что оно происходит редко (программа запускается один раз минуту, и это происходит каждые одну или две недели) и оно запускается на сервере, но у меня очень сильное подозрение, что это происходит в функции сбора, поскольку это единственная функция, которая у меня есть, и сообщение, похоже, относится к асинхронному фьючерсу .
Основываясь на том, что я нашел в документации, я бы предположил, что проблема здесь в том, что я добавляю эти сопрограммы в список, который затем позже ожидается с помощью asyncio.gather, но в очень редких случаях. случаях задача уже есть сделано до того, как оно будет добавлено в asyncio.gather.
Мои вопросы:
  • Правильно ли мое предположение о причине?
  • Является ли сообщение просто информацией от asyncio, но все по-прежнему работает нормально, или это исключение, которое приводит к остановке моей программы? Потому что для исключений я обычно получаю трассировку стека, чего здесь нет.
  • Есть ли способ улучшить этот раздел моего кода, чтобы эта ошибка больше не повторялась, поскольку ее не должно быть действительно ли проблема в том, что какая-то функция выполняется быстрее?
Редактировать: благодаря совету VPfB я понял, что это сообщение исходит из библиотеки OPC UA. Я использую в задаче. Поэтому я продолжу расследование в этом направлении.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ready-done
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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