Diese Frage bezieht sich auf Leistungseinbußen, die sich aus einer großen Anzahl schlafender Python-Threads auf einem Webserver ergeben können.Python: Strafe für schlafende Threads
Hintergrund: Ich implementiere einen Onlineshop mit django/satchmo. Voraussetzung ist eine verspätete Zahlung. Der Kunde kann ein Produkt reservieren und zu einem späteren Zeitpunkt von einem Dritten bezahlen lassen (über eine zufällige und eindeutige URL).
Um einen Artikel zu reservieren, erstelle ich einen Thread, der für die Reservierungszeit schläft und dann die Reservierung entfernt/markiert das Produkt als verkauft, wenn es erwacht. Es sieht wie folgt aus:
#Reserves a product when it is placed in the cart
def reserve_cart_product(product):
log.debug("Reserving %s" % product.name)
product.active = False
product.featured = False
product.save()
from threading import Timer
Timer(CART_RESERVE_TIME, check_reservation, (product,)).start()
ich die gleiche Technik verwende, wenn die eindeutige URLs Culling, nachdem sie abgelaufen sind, wird nur der Timer für viel länger schläft (in der Regel 5 Tage).
Also, um Ihnen meine Frage ist so wie folgt:
eine große numnber Schlaf Fäden gehen ernsthaft Leistung Wirkung zeigt? Gibt es bessere Techniken, um eine einmalige Veranstaltung in der Zukunft zu planen? Ich würde dies gerne in Python behalten, wenn möglich; Kein Anruf at
oder cron
über sys
.
Die Website ist nicht gerade stark frequentiert; Eine (großzügige) Obergrenze für Produkte, die pro Woche bestellt werden, liegt bei etwa 100. In Kombination mit einer Wagenreservierung könnte dies bedeuten, dass mehr als 100 Schlaffäden gleichzeitig vorhanden sind. Werde ich es bereuen, Aufgaben auf diese Weise zu planen?
Danke
Sie möchten vielleicht eine beständigere Lösung als Threads für den Fall, dass Ihr Server ausfällt. Soweit ich das beurteilen kann, müssen Sie Ihre Log-Datei durchsuchen, um zu erfahren, welche Produkte nach einem Absturz reserviert wurden (obwohl Sie nicht wissen, wie lange sie mit dem obigen Code reserviert waren). – tgray
Sie machen einen guten Punkt und aus diesem Grund habe ich begonnen, einige Datensätze in der DB zu speichern. – pisswillis
Sie gehen davon aus, dass Ihr Server nicht neu gestartet wird, und Sie werden nicht Tausende von Bestellungen erhalten, richtig? Eine robustere Option wäre ein persistentes Datenbankwarteschlangensystem wie RabbitMQ. –