Cette question concerne les pénalités de performance qui peuvent découler ou non d'un grand nombre de threads python endormis sur un serveur Web. Contexte: J'implémente une boutique en ligne en utilisant django/satchmo. Une exigence est pour le paiement différé. Le client peut réserver un produit et permettre à un tiers de le payer à une date ultérieure (via une URL aléatoire et unique).Python: pénalité pour les threads dormants
Pour gérer un article sans réserve, je crée un fil qui dormira pendant la durée de la réservation, puis retirera la réservation/marquera le produit tel qu'il est vendu lorsqu'il se réveillera. Il ressemble à ceci:
#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()
J'utilise la même technique lorsque les URL uniques culling après leur expiration, que la minuterie dort beaucoup plus longtemps (généralement 5 jours).
Alors, ma question est SO comme suit:
est d'avoir un grand numnber de fils allant dormir pour effectuer sérieusement les performances? Y a-t-il de meilleures techniques pour planifier un événement unique dans le futur? Je voudrais garder ceci en python si possible; aucun appel at
ou cron
via sys
.
Le site n'est pas exactement à fort trafic; une limite supérieure (généreuse) sur les produits commandés par semaine serait d'environ 100. Combiné avec la réservation de chariot, cela pourrait signifier qu'il y a plus de 100 fils dormants à la fois. Est-ce que je regretterai de programmer des tâches de cette manière?
Merci
Vous pouvez avoir besoin d'une solution plus persistante que les threads au cas où votre serveur tombe en panne. Autant que je sache, vous devrez rechercher votre fichier journal pour savoir quels produits ont été réservés après un plantage (bien que vous ne sachiez pas combien de temps ils ont été réservés avec le code ci-dessus). – tgray
Vous faites un bon point et c'est pour cette raison que j'ai commencé à stocker des enregistrements dans la BD. – pisswillis
Vous supposez que votre serveur ne redémarrera pas, et vous n'obtiendrez pas des milliers de commandes, n'est-ce pas? Une option plus robuste serait un système de mise en file d'attente de base de données persistante, tel que RabbitMQ. –