我有一个Python函数,一旦访问它就会生成一个图像。我可以直接在HTTP请求时调用它,也可以使用Gearman异步调用它。 有很多请求。
哪种方式更好:
哪个选项更好?
在这种情况下,“更好”意味着最好的速度/负载组合。图像生成示例是符号,因为它也可以应用于数据库连接和其他事物。
答案 0 :(得分:1)
如果您的程序在解释器中受CPU限制,那么即使有足够的处理器来运行它们,产生多个线程实际上也会降低结果的速度。这是因为GIL(全局解释器锁)一次只允许一个线程在解释器中运行。
如果大多数工作都发生在C库中,那么很可能锁不存在,您可以高效地使用多个线程。
如果你自己生成线程,你需要确保不要创建太多 - 一个10K线程是坏消息 - 所以你需要设置线程读取的工作队列而不是产生他们在一个循环中。
如果我这样做,我只会使用标准的多处理模块。
答案 1 :(得分:1)
我有一个Python函数 生成图像 访问。我可以调用它 直接在HTTP请求上,或者做 异步使用Gearman。那里 是很多要求。
您不应该在请求中执行此操作,因为您无法限制(您的服务器可能会超载)。所有大型站点都使用消息队列进行脱机处理。
哪个选项更好?
在这种情况下,“更好”意味着 最佳速度/负载组合。该 图像生成的例子是 象征性的,因为这也可以 应用于数据库连接和 其他的事情。
你应该异步进行,因为除了它加速你的网站之外最有说服力的理由是你可以在高负荷时限制你的队列。您可以先执行优先级最高的任务。
我相信forking processes很贵。我会创建一些工作进程(可能在进程内做一点线程)来处理负载。我可能会使用redis,因为它是fast,actively developed(antirez / pietern几乎每天提交)并且非常good/stable python client library。 blpop / rpush可用于模拟队列(作业)