Die Ausführung von Asyncio Coroutine hat gestoppt und keinen Fehler zurückgegebenPython

Python-Programme
Guest
 Die Ausführung von Asyncio Coroutine hat gestoppt und keinen Fehler zurückgegeben

Post by Guest »

Ich habe ein seltsames Verhalten bei einer meiner Anwendungen. Ich habe also eine Anwendung mit einem Beitrag Eintragspunkt, der eine Liste von Bestell -IDs erhält, und nach der Bearbeitung jeder Bestellung muss eine externe API über den Geldwert jeder Bestellung informiert werden. Also, was wir getan haben, war Folgendes: < /p>

Code: Select all

order_details_tasks = [
asyncio.create_task(
self.launch_individual_order_details(order),
name=f"task_order_{order.id}",
)
for order in active_orders
]
results = await asyncio.gather(*order_details_tasks, return_exceptions=True)
for task, result in zip(order_details_tasks, results):
if isinstance(result, Exception):
print(f"⚠️ Task '{task.get_name()}' raised an exception: {result}")
else:
print(f"✅ Task '{task.get_name()}' succeeded with result: {result}")
Die Funktion sterp_individual_order_details (order) Führen Sie die folgenden Dinge und andere Nicht -I/O -Logik vor diesem Block aus:

Code: Select all

logger.debug(f"Sending order details with success for order: {order.id}")
await order_service.send_order_request(order)
Inside send_order_request Wir erstellen einen Eintrag in einer Tabelle namens Transaction mit der Bestell -ID und dem entsprechenden Bestellbetrag sowie in ausstehender Status und senden Sie die HTTP -Anforderung mit AIOHTTP. Client Bibliothek. Anschließend aktualisieren wir den Transaktionsstatus zum Erfolg, wenn die Anfrage -Antwort erfolgreich ist und fehlerhaft ist, wenn die Anforderung fehlschlägt. < /P>
Das Problem, mit dem wir konfrontiert sind Laden Sie unsere Schoten ein, wenn der Pod 70% der CPU -Grenzen verwendet, die wir ihnen geben. Wir bemerken, dass einige unserer Aufgaben einfach die Ausführung brechen und die Ereignisschleife nicht über einen möglichen Fehler informieren.
Wir haben dies entdeckt, weil wir nach einigen Ladetesten einige Skripte durchführten, um den Transaktionsstatus zu überprüfen, und festgestellt haben, dass einige Bestell -IDs nur den Transaktionsstatus ausstehend hatten, sodass sie die Anfrage nicht einmal an die externe API ausgeführt haben. Darüber hinaus haben wir festgestellt, dass für alle in diesem Zustand befandenen Bestellungen sie nicht im Aufgabenprotokoll der Succes erschienen sind: < /p>

Code: Select all

print(f"✅ Task '{task.get_name()}' succeeded with result: {result}").
< /code>
und sie werden auch nicht im Fehleraufgabeprotokoll angezeigt: < /p>
print(f"⚠️ Task '{task.get_name()}' raised an exception: {result}").
Darüber hinaus haben wir die Ereignisschleife Protokolle Debuggen auf True umgebracht und finden keine mit diesen Aufgaben verbundenen Fehler. Das einzige, was wir herausgefunden haben, ist, dass die Ausführung dieses Protokoll erreicht: < /p>

Code: Select all

logger.debug(f"Sending order details with success for order: {order.id}")
und dass der Transaktionszustand für diese Bestellung mit ausstehend Status erstellt wird, aber nie wieder aktualisiert wird.
Hat jemand eine Idee Warum können diese Fälle stattfinden? < /p>
import asyncio

import aiohttp

async def stack_overflow_script(active_orders):
order_details_tasks = [
asyncio.create_task(
launch_individual_order_details(order),
name=f"task_order_{order}",
)
for order in active_orders
]
results = await asyncio.gather(*order_details_tasks, return_exceptions=True)
for task, result in zip(order_details_tasks, results):
if isinstance(result, Exception):
print(f"⚠️ Task '{task.get_name()}' raised an exception: {result}")
else:
print(f"✅ Task '{task.get_name()}' succeeded with result: {result}")

async def launch_individual_order_details(order):
print(f"Sending round details for play: {order}")
await send_order_request(order)

async def send_order_request(order):
params = dict(order_id=order)
try:
async with aiohttp.ClientSession(
) as session:
async with session.request(
"POST",
url="https://stack-mre.free.beeceptor.com/order",
timeout=10,
json=params
) as resp:
resp_json = await resp.json()
return resp_json

except asyncio.TimeoutError:
return

asyncio.run(stack_overflow_script([2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]))
< /code>
oben ist ein minimal reproduzierbares Skript dessen, was ich erreichen möchte. Ich weiß nicht, ob mein Problem beim Ausführen dieses Skripts stattfinden wird, aber ich möchte teilen, dass einige dieser Aufgaben manchmal nicht aus der Thread -Ereignisschleife ausführen und einfach verschwinden, ohne nur einen Fehler zur Ausführung zurückzugeben. < /P>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post