esta pregunta se refiere a las penalidades de rendimiento que pueden surgir o no de tener una gran cantidad de subprocesos python dormidos en un servidor web.Python: penalización por hilos inactivos
Antecedentes: estoy implementando una tienda en línea usando django/satchmo. Un requisito es para el pago retrasado. El cliente puede reservar un producto y permitir que un tercero lo pague en una fecha posterior (a través de una URL aleatoria y única).
Para manejar la falta de mantenimiento de un artículo, estoy creando un hilo que dormirá durante el tiempo de reserva y luego elimino la reserva/marca el producto como vendido cuando despierta. Se ve así:
#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()
estoy usando la misma técnica cuando el sacrificio de los URLs únicas después de que hayan expirado, sólo el temporizador duerme durante mucho más tiempo (típicamente 5 días).
Por lo tanto, mi pregunta para que también lo es de la siguiente manera:
está teniendo un gran numnber de hilos va a afectar seriamente el rendimiento de dormir? ¿Hay mejores técnicas para programar un evento único en algún momento en el futuro? Me gustaría mantener esto en python si es posible; sin llamadas at
o cron
a través de sys
.
El sitio no es exactamente de alto tráfico; un límite superior (generoso) para los productos pedidos por semana sería de alrededor de 100. Combinado con la reserva de la compra, esto podría significar que hay más de 100 hilos para dormir en cualquier momento. ¿Lamentaré las tareas de programación de esta manera?
Gracias
Es posible que desee una solución más persistente que los hilos en caso de que su servidor se caiga. Por lo que puedo decir, tendrá que buscar en su archivo de registro para saber qué productos se reservaron después de un bloqueo (aunque no sabrá cuánto tiempo estuvieron reservados para el código anterior). – tgray
Haces un buen punto y es por esta razón que he comenzado a almacenar algunos registros en la base de datos. – pisswillis
Supongo que su servidor no se reiniciará y no obtendrá miles de pedidos, ¿verdad? Una opción más robusta sería un sistema persistente de cola de bases de datos, como RabbitMQ. –