Python 线程与异步图像处理?

Python 线程与异步图像处理?,python,asynchronous,gearman,Python,Asynchronous,Gearman,我有一个Python函数,一旦被访问就会生成一个图像。我可以在HTTP请求时直接调用它,也可以使用Gearman异步调用它。有很多要求 哪种方式更好: 内联-内联创建图像,将导致一次生成多个图像 异步-队列作业(使用Gearman)并在工作线程中生成映像 哪个选项更好? 在这种情况下,“更好”意味着最佳速度/负载组合。图像生成示例是象征性的,因为这也可以应用于数据库连接和其他事情。如果您的程序在解释器中受CPU限制,那么生成多个线程实际上会降低结果,即使有足够的处理器来运行它们。这是因为GI

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

哪种方式更好:

  • 内联-内联创建图像,将导致一次生成多个图像
  • 异步-队列作业(使用Gearman)并在工作线程中生成映像
哪个选项更好?


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

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

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

如果您自己正在生成线程,则需要确保不要创建太多线程-一次创建10K线程将是个坏消息-因此您需要设置一个线程读取的工作队列,而不仅仅是在循环中生成线程

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

我有一个Python函数 创建图像后生成图像 访问。我可以调用它 直接响应HTTP请求,或者执行此操作 异步使用Gearman。那里 有很多要求

您不应该在请求内部执行此操作,因为这样您就无法控制(您的服务器可能会过载)。所有大型站点都使用消息队列进行脱机处理

哪种选择更好

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

你应该异步进行,因为这样做最有说服力的原因除了它能加速你的网站外,就是你可以在高负载时限制你的队列。您可以首先以最高优先级执行任务



我相信它很贵。我将创建两个工作进程(可能在进程内部执行一些线程)来处理负载。我可能会使用它,因为它是,(/几乎每天提交),并且有一个非常好的特性。blpop/rpush可用于模拟队列(作业)

,这取决于生成一个映像需要多少时间?如果这段时间很短,在同一台机器上进行处理会得到更好的结果。你说的“独立工人”是指独立的过程还是独立的机器?处理是由python代码、本机编译的python模块还是其他东西完成的?这些问题的答案会影响您从各种选项中期望的效率。请更改它。现在更有意义了。我更新了我的答案,因为我相信我现在能更好地回答你的问题吗?