1

我有一个 Python 函数,一旦访问它就会生成一个图像。我可以根据 HTTP 请求直接调用它,也可以使用 Gearman 异步调用它。有很多要求。

哪种方式更好:

  • 内联- 内联创建图像,将导致一次生成许多图像
  • 异步- 排队作业(使用 Gearman)并在工作人员中生成图像

哪个选项更好?

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

4

2 回答 2

1

如果您的程序在解释器中受 CPU 限制,那么即使有足够的处理器来运行它们,产生多个线程实际上也会减慢结果。这是因为 GIL(全局解释器锁)一次只允许一个线程在解释器中运行。

如果大部分工作发生在 C 库中,则很可能没有持有锁,您可以高效地使用多个线程。

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

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

于 2011-01-30T17:37:46.220 回答
1

我有一个 Python 函数,一旦访问它就会生成一个图像。我可以根据 HTTP 请求直接调用它,也可以使用 Gearman 异步调用它。有很多要求。

你不应该在你的请求中这样做,因为那样你就不能节流(你的服务器可能会过载)。所有大型站点都使用消息队列进行离线处理。

哪个选项更好?

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

您应该异步执行此操作,因为除了加快您的网站速度之外,执行此操作的最令人信服的原因是,如果您处于高负载状态,您可以限制您的队列。您可以先执行具有最高优先级的任务。


我相信分叉过程很昂贵。我会创建几个工作进程(也许在进程内部做一些线程)来处理负载。我可能会使用redis,因为它快速积极开发antirez / pietern几乎每天都提交)并且有一个非常好的/稳定的 python 客户端库。blpop/rpush 可用于模拟队列(作业)

于 2011-01-31T00:52:36.610 回答