在任何Rails代码中,代码并发都是默认的。一个线程化的Web服务器将同时为许多HTTP请求提供服务,并且每个请求都将持有其控制器实例。线程化的主动工作适配器和行动电缆通道也会同时处理多个请求。即使全局进程空间是共享的,每个实例的工作也是单独管理的。对于共享空间不被改变的情况下,这个过程将顺利运行。
让我们详细看看这在我们的Rails应用程序中是如何管理的。
- 执行器:执行器通过对应用程序代码的包装来分离框架和应用程序代码。
在Rails 5.0之前,对代码的包装是比较复杂的。为了保护代码,要么使用单独的Rack中间件类,要么使用直接包装。随着Rails最近的更新,执行器在一个单一的步骤中处理包装问题,这更容易理解。
调用执行器来包装应用程序代码,因为你调用它。
比如说:

执行器的一个吸引人的特点是它的重入性。
执行器的两个回调是'运行'和'。来完成。"这使得在不可能将代码包装成块的情况下,可以将代码包装成部分。

当前线程被移动到 "运行 " 模式,暂时阻断线程。因此,该线程将不会被任何其他试图这样做的请求所访问。
- 重新加载器:Reloader的功能与Executor类似。要保护的代码在另一个请求被击中之前被包裹起来。这适用于应用程序代码被任何长期运行的进程多次调用的情况。大多数情况下,在Rails中,Web请求和Active Jobs默认是被包裹的。所以很少使用Reloader。
当需要重新加载应用程序时,才会使用Reloader。当请求条件要求重新加载时,Reloader会延迟应用程序的重新加载,直到它是安全的。而对于应用程序重载被强制要求的情况,Reloader会等待,直到当前块被执行并允许重载。因此,代码被保护免受错误的影响。
to_run'和'to_complete回调也被重新加载器使用。
在Reloader的过程中涉及到一个类的卸载 。在这里,所有自动加载的类被移除,并为进一步加载做好准备。应用程序的重新加载只发生在类卸载之前或之后,因此,Reloader的两个额外的回调是'before_class_unload'和'after_class_unload'。
Executor和Reloaders也被Rails框架组件所使用。 ActionDispatch::Executor和 ActionDispatch::Reloader 被包含在默认的应用程序栈中。每当代码发生变化时,Reloader就会为HTTP请求提供一个新的应用程序副本。Active Job功能也利用Reloaders,而Action Cable使用Executor。Action Cable还使用Reloader的before_class_unload来断开所有的连接。
正如所讨论的,代码的并发性在默认情况下是通过Rails代码的线程活动作业和行动电缆功能来处理的。随着最近Rails的更新,还增加了执行器和重载器,以改善代码并发处理。
The postCode Concurrency and Two Easy Fixesappeared first onEngineYard.