to pytanie dotyczy kar za występowanie, które mogą, ale nie muszą, wynikać z posiadania dużej liczby śpiących wątków Pythona na serwerze internetowym.Python: kara za zasypianie wątków
Tło: Wdrażam sklep internetowy, używając django/satchmo. Wymóg dotyczy opóźnionej płatności. Klient może zarezerwować produkt i pozwolić stronie trzeciej na zapłacenie za niego w późniejszym terminie (za pośrednictwem losowego i unikalnego adresu URL).
Aby obsłużyć niezrezerwowanie przedmiotu, tworzę wątek, który będzie spać przez czas rezerwacji, a następnie usunie rezerwację/oznaczy produkt jako sprzedany, gdy się obudzi. Wygląda to tak:
#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()
Używam tej samej techniki podczas uboju unikalnych adresów po ich wygaśnięciu, tylko Timer śpi znacznie dłużej (zwykle 5 dni).
Więc moje pytanie do was tak przedstawia się następująco:
jest posiadanie dużej numnber wątków wykraczających poważnie wpływa wydajność śpi? Czy istnieją lepsze techniki planowania jednorazowego wydarzenia w przyszłości? Chciałbym zachować to w pythonie, jeśli to możliwe; bez wywoływania at
lub cron
przez sys
.
Strona nie jest dokładnie dużym natężeniem ruchu; górny limit produktów zamówionych w tygodniu wynosiłby około 100. W połączeniu z rezerwacją wózka może to oznaczać, że w danej chwili jest ponad 100 śpiworek. Czy będę żałować zadań planowania w ten sposób?
Dzięki
Możesz potrzebować bardziej trwałego rozwiązania niż wątki na wypadek awarii serwera. O ile mogę powiedzieć, będziesz musiał przeszukać plik logu, aby stwierdzić, które produkty zostały zarezerwowane po awarii (choć nie będziesz wiedział, jak długo były zarezerwowane dla powyższego kodu). – tgray
Dobrze trafiłeś i właśnie dlatego zacząłem zapisywać jakiś rekord w DB. – pisswillis
Zakładasz, że twój serwer nie uruchomi się ponownie i nie dostaniesz tysięcy zamówień, prawda? Bardziej niezawodną opcją byłby stały system kolejkowania baz danych, taki jak RabbitMQ. –