2011-01-30 77 views
1

我有一个Python函数,它在访问后会生成一个图像。我可以直接在HTTP请求中调用它,或者使用Gearman异步执行它。 有很多要求。线程与异步图像处理?

哪种方式更好:

  • 在线 - 创建一个图像内联,会导致许多图像一次
  • 异步正在生成 - 队列作业(与使用Gearman)和生成图像在工作人员中

哪个选项更好?

在这种情况下,“更好”意味着最佳速度/负载组合。图像生成示例是符号化的,因为这也可以应用于数据库连接和其他事物。

+0

这取决于,费时是如何产生1个图像?如果这个时间很短,你会在同一台机器上得到更好的结果。 – arthurprs 2011-01-30 17:09:37

回答

1

我有一个Python函数,它在 被访问后会生成一个图像 。我可以直接在HTTP请求上调用 ,或者使用Gearman异步执行 。有 是很多的要求。

你不应该在你的要求内做它,因为那样你就无法节制(你的服务器可能会超载)。所有大网站都使用消息队列来离线处理。

哪种选择更好?

在这种情况下,“好”就意味着 最佳的速度/负载组合。所述 图像生成例子是 象征,因为这也可以是施加于数据库连接和其他东西 。

你应该这样做异步的,因为最有说服力的理由,除了它加速了你的网站做的是,如果你是在高负载,可以扼杀你的队列中。您可以先执行优先级最高的任务。


我认为forking processes是昂贵的。我会创建一些工作进程(也许在进程内部进行一些线程处理)来处理负载。我可能会使用redis,因为它是fast,(antirez/pietern承诺几乎每天),并有一个非常good/stable python client library。 BLPOP/RPUSH可以用于模拟一个队列(作业)

1

如果你的程序在编译器中,然后产卵多线程实际上会减慢,即使有足够的处理器来运行它们所有的结果必然CPU。发生这种情况是因为GIL(全局解释器锁)一次只允许一个线程在解释器中运行。

如果大部分工作发生在C库很可能将锁不被占用,您可以高效地使用多个线程。

如果你自己在产生线程,你需要确保不要创建太多的线程 - 一个线程中的10K线程是坏消息 - 所以你需要设置一个线程读取的工作队列而不是仅仅在一个循环中产卵它们。

如果我这样做,我只是使用标准的多模块。