【发布时间】:2010-02-01 17:09:20
【问题描述】:
这个问题与在网络服务器上拥有大量睡眠 python 线程可能会或可能不会产生的性能损失有关。
背景:我正在使用 django/satchmo 实现一个在线商店。要求是延迟付款。客户可以预订产品并允许第三方在以后付款(通过随机且唯一的 URL)。
为了处理取消预订的项目,我正在创建一个线程,该线程将在预订时间内休眠,然后在唤醒时删除预订/将产品标记为已售。它看起来像这样:
#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()
我在剔除过期后的唯一 URL 时使用相同的技术,只有 Timer 的睡眠时间更长(通常为 5 天)。
所以,我对你的问题如下:
拥有大量休眠线程会严重影响性能吗?是否有更好的技术来安排未来某个时间的一次性活动。如果可能的话,我想把它保存在 python 中;请勿通过sys 致电at 或cron。
该网站的流量并不高;每周订购的产品的(大量)上限约为 100 件。结合购物车预订,这可能意味着任何时候都有 100 多个睡眠线程。我会后悔以这种方式安排任务吗?
谢谢
【问题讨论】:
-
您可能需要一个比线程更持久的解决方案,以防您的服务器出现故障。据我所知,您必须搜索您的日志文件以了解崩溃后保留了哪些产品(尽管您不知道使用上述代码保留了多长时间)。
-
你说得很好,正是出于这个原因,我开始在数据库中存储一些记录。
-
您假设您的服务器不会重新启动,并且您不会收到数千个订单,对吧?更健壮的选择是持久数据库队列系统,例如 RabbitMQ。
-
@pisswillis,我遇到了完全相同的问题。我认为太多的睡眠线程会导致主要的性能问题。我会阅读答案,希望找到一个好的解决方案。
-
@pisswillis,不。看起来没有人相信这么多的睡眠线程(在我的情况下超过 300 个)开始引起问题。我会在互联网上搜索,希望能找到解决方案。
标签: python performance multithreading