当前位置: 首页 > 知识库问答 >
问题:

Puma中的工人和线程有什么区别

岳晟
2023-03-14

美洲狮工人和美洲狮线程之间的区别是什么?

我知道的(如果我错了,请纠正我):

>

在unicorn中,我知道我可以在一个进程中使用多个unicorn Worker来添加并发性。

但在美洲狮有线程和工人...工人不是美洲狮进程中的线程吗?

我可以在Heroku中使用更多的工作线程来添加web并发吗?

共有3个答案

梁豪
2023-03-14

我只想强调这里引用的Heroku/Puma文章中最重要的一句话:

Rails维护自己的数据库连接池,并为每个工作进程创建一个新池。辅助线程中的线程将在同一池上运行。

声明每个工作人员都有自己的池。然而:

辅助线程中的线程将在同一池上运行。

理解这一点非常重要。如果Puma工作线程每个工作线程使用5个线程,则必须将database.yml配置为5个连接池,因为每个线程都可能建立数据库连接。

由于每个工作线程都是由system fork()生成的,因此新工作线程将有自己的一组5个线程要处理,因此对于创建的新Rails实例,database.yml仍将设置为5个连接池。

现在database.yml连接池和实际的数据库池是两个不同的东西。与数据库的总连接需要使用Heroku文档中提到的特定公式:

确定每个应用程序需要的连接数的一个好公式是用RAILS\u MAX\u线程乘以WEB\u并发性。

这意味着,如果您使用2个worker,每个worker有5个线程,那么2*5=10,那么您的数据库必须配置为接受10个并发连接。

米元凯
2023-03-14

这是一个很大的领域,我不是专家,但是。。。

Puma可以产生许多工作线程,每个工作线程可以使用许多线程来处理请求。

据我所知,Unicorn没有线程,它只有worker模型。

如果使用线程,则需要确保代码是线程安全的。这意味着Rails、您所依赖的任何宝石以及您自己的代码。

为了获得最佳性能,您可能还需要研究具有适当线程支持的JRuby或Rubinius。MRI受其GIL的限制。

有一篇关于Heroku的好文章解释了Puma如何使用工人和线程。你可能应该读一下,然后不理我:)

微生德泽
2023-03-14

正如另一个答案所述,这篇Heroku文章对某些配置项进行了很好的解释。

然而,如果您需要在Heroku或其他任何地方调整应用程序,那么了解如何工作是值得的。

我认为你说的“worker是puma进程中的一个线程”几乎是正确的,我相信worker是一个从puma派生出来的操作系统级进程,它可以在内部使用线程。

据我所知,puma将分叉其操作系统进程,无论您多次通过workers配置来响应http请求。这在处理多个请求方面为您提供了并行性,但这通常会占用更多内存,因为它会为每个工作者“复制”您的应用程序代码。

根据线程配置,每个puma工作进程将在其OS进程中使用多个线程。通过允许puma进程本身响应多个请求,从而增加了并发性,这样,如果一个线程被阻塞,即处理一个请求,它就可以用另一个线程处理一个新的请求。如上所述,这要求您的整个应用程序是线程安全的,例如,一个请求中的任何全局配置都不会“泄漏”到另一个请求中。

您可以调整Puma,使辅助进程的数量足以满足CPU和可用存储器的数量,然后根据您希望运行应用程序的主机饱和的程度以及应用程序的行为来调整线程——更多并不总是相等的更快/更多的请求吞吐量。

 类似资料:
  • 本文向大家介绍线程的 run() 和 start() 有什么区别?相关面试题,主要包含被问及线程的 run() 和 start() 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 start() 方法用于启动线程,run() 方法用于执行线程的运行时代码。run() 可以重复调用,而 start() 只能调用一次。

  • 每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,run()方法称为线程体。通过调用Thread类的start()方法来启动一个线程。 start() 方法用于启动线程,run() 方法用于执行线程的运行时代码。run() 可以重复调用,而 start() 只能调用一次。 start()方法来启动一个线程,真正实现了多线程运行。调用start()方法无需等待run方法体

  • 问题内容: 进程和线程之间的技术区别是什么? 我感到像“过程”这样的词已被过度使用,并且还有硬件和软件线程。像Erlang这样的语言的轻量级进程怎么样?有确定的理由使用一个术语而不是另一个术语吗? 问题答案: 进程和线程都是独立的执行序列。典型的区别是(同一进程的)线程在共享内存空间中运行,而进程在单独的内存空间中运行。 我不确定您可能指的是“硬件”还是“软件”线程。线程是一种操作环境功能,而不是

  • 本文向大家介绍进程和线程的区别是什么?相关面试题,主要包含被问及进程和线程的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA进程 进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。  

  • 使用java配置时,可以向步骤中添加一个TaskExecutor,如下例所示: 上述配置的结果是,该步骤通过在单独的执行线程中读取、处理和写入每个项块(每个提交间隔)来执行。请注意,这意味着要处理的项没有固定的顺序,与单线程的情况相比,块可能包含不连续的项。除了任务执行器设置的任何限制(例如它是否由线程池支持)之外,在tasklet配置中还有一个节流限制,默认设置为4。您可能需要增加这一点,以确保

  • 在Java中,我们可以调用interrupt()方法来中断线程,然后被中断的线程可以管理该中断(通过捕获InterruptedException,或者在检查thread.interrupted()之后)。 操作系统还可以挂起一个线程,例如,如果它想切换到另一个线程。 是否暂停和中断两个完全不同的操作?操作系统是否也可以中断线程?