线程与异步图像处理?

2024-05-29 05:47:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

哪种方式更好:

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

哪个选项更好?

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


Tags: 函数图像数据库http示例选项作业方式
2条回答

I have a Python function which generates an image once it is accessed. I can either invoke it directly upon a HTTP request, or do it asynchronously using Gearman. There are a lot of requests.

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

Which option is better?

In this case "better" would mean the best speed / load combinations. The image generation example is symbolical, as this can also be applied to Database connections and other things.

你应该异步进行,因为这样做除了加快网站速度外,最有说服力的原因是,如果你处于高负载状态,你可以限制你的队列。您可以先执行优先级最高的任务。在


我相信forking processes很贵。我将创建两个工作进程(可能在进程内部执行一些线程处理)来处理负载。我可能会使用redis,因为它是fastactively developedantirez/pietern几乎每天都提交),并且有一个非常good/stable python client library。blpop/rpush可用于模拟队列(作业)

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

如果一个库中的多个线程不能有效地使用它,那么它很可能在C中无法有效地使用。在

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

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

相关问题 更多 >

    热门问题