Код: Выделить всё
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, но все по-прежнему работает нормально, или это исключение, которое приводит к остановке моей программы? Потому что для исключений я обычно получаю трассировку стека, чего здесь нет.
- Есть ли способ улучшить этот раздел моего кода, чтобы эта ошибка больше не повторялась, поскольку ее не должно быть действительно ли проблема в том, что какая-то функция выполняется быстрее?
Подробнее здесь: https://stackoverflow.com/questions/793 ... ready-done
Мобильная версия