我有一个 Python 函数,一旦访问它就会生成一个图像。我可以根据 HTTP 请求直接调用它,也可以使用 Gearman 异步调用它。有很多要求。
哪种方式更好:
- 内联- 内联创建图像,将导致一次生成许多图像
- 异步- 排队作业(使用 Gearman)并在工作人员中生成图像
哪个选项更好?
在这种情况下,“更好”意味着最好的速度/负载组合。图像生成示例是象征性的,因为这也可以应用于数据库连接和其他事物。
我有一个 Python 函数,一旦访问它就会生成一个图像。我可以根据 HTTP 请求直接调用它,也可以使用 Gearman 异步调用它。有很多要求。
哪种方式更好:
哪个选项更好?
在这种情况下,“更好”意味着最好的速度/负载组合。图像生成示例是象征性的,因为这也可以应用于数据库连接和其他事物。
如果您的程序在解释器中受 CPU 限制,那么即使有足够的处理器来运行它们,产生多个线程实际上也会减慢结果。这是因为 GIL(全局解释器锁)一次只允许一个线程在解释器中运行。
如果大部分工作发生在 C 库中,则很可能没有持有锁,您可以高效地使用多个线程。
如果你自己产生线程,你需要确保不要创建太多 - 10K 线程一个是坏消息 - 所以你需要设置一个线程读取的工作队列,而不是仅仅在一个环形。
如果我这样做,我只会使用标准的多处理模块。
我有一个 Python 函数,一旦访问它就会生成一个图像。我可以根据 HTTP 请求直接调用它,也可以使用 Gearman 异步调用它。有很多要求。
你不应该在你的请求中这样做,因为那样你就不能节流(你的服务器可能会过载)。所有大型站点都使用消息队列进行离线处理。
哪个选项更好?
在这种情况下,“更好”意味着最好的速度/负载组合。图像生成示例是象征性的,因为这也可以应用于数据库连接和其他事物。
您应该异步执行此操作,因为除了加快您的网站速度之外,执行此操作的最令人信服的原因是,如果您处于高负载状态,您可以限制您的队列。您可以先执行具有最高优先级的任务。
我相信分叉过程很昂贵。我会创建几个工作进程(也许在进程内部做一些线程)来处理负载。我可能会使用redis,因为它快速、积极开发(antirez / pietern几乎每天都提交)并且有一个非常好的/稳定的 python 客户端库。blpop/rpush 可用于模拟队列(作业)