Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么Rails操作控制器不使用线程?_Ruby On Rails_Ruby_Multithreading_Actioncontroller - Fatal编程技术网

Ruby on rails 为什么Rails操作控制器不使用线程?

Ruby on rails 为什么Rails操作控制器不使用线程?,ruby-on-rails,ruby,multithreading,actioncontroller,Ruby On Rails,Ruby,Multithreading,Actioncontroller,我的Rails应用程序有一条路径需要花费很多时间来处理,这会使整个网页冻结 为什么会发生这种情况?是Rails还是非线程安全的第三方gem 有办法解决这个问题吗?我正在考虑使用一个进程池,就像一个线程池一样,只是它更重,需要很多内存,但比停止整个应用程序要便宜 Rails对中间件堆栈中的整个请求使用互斥锁,因此Rails进程一次只接受一个请求 但是,您可以通过启用config.threadsafe选项,并使用多线程服务器,如Puma 然后是使用MRI的整个障碍,它不允许两个线程同时运行,除非它们

我的Rails应用程序有一条路径需要花费很多时间来处理,这会使整个网页冻结

  • 为什么会发生这种情况?是Rails还是非线程安全的第三方gem
  • 有办法解决这个问题吗?我正在考虑使用一个进程池,就像一个线程池一样,只是它更重,需要很多内存,但比停止整个应用程序要便宜

  • Rails对中间件堆栈中的整个请求使用互斥锁,因此Rails进程一次只接受一个请求

    但是,您可以通过启用
    config.threadsafe选项,并使用多线程服务器,如Puma

    然后是使用MRI的整个障碍,它不允许两个线程同时运行,除非它们执行非阻塞I/O


    您需要使用支持真实线程的Ruby实现,如Rubinius或Jruby。

    Rails在中间件堆栈中的整个请求周围使用互斥锁,因此Rails进程一次只接受一个请求

    但是,您可以通过启用
    config.threadsafe选项,并使用多线程服务器,如Puma

    然后是使用MRI的整个障碍,它不允许两个线程同时运行,除非它们执行非阻塞I/O


    您需要使用支持真实线程的Ruby实现,例如Rubinius或Jruby。

    首先要注意的是,Rails操作不应该很重。当用户请求页面时,您应该立即为用户提供服务

    现在,有些情况下,您需要用户等待结果,在这种情况下,您可以始终使用WebSocket或

    现在,Ruby和Rails在线程方面有一个问题,您可以在“”中阅读

    您可以在Rails中使用的一个解决方案是使用Unicorn之类的服务器,它可以根据您的需要提供尽可能多的进程工作者,并且每个进程工作者将独立于其他进程工作者工作,Puma用于创建多线程,等等

    现在,如果您有一个操作是一个繁重的过程,您可能希望将工作延迟到一个进程池中,如
    delayed\u job
    。您甚至可以使用JavaScript创建一个漂亮的UI来获取作业状态并向用户显示进度。您可以使用RabbitMQ执行的任务池,其中后台的另一个进程可以侦听新消息并对其执行操作,甚至给出响应,等等


    请记住,大多数Web服务器都有一个客户端超时,您不希望用户等待一分钟或更长时间而没有响应,因此在操作完成时,使用流响应立即提供一些反馈总是很好的,或者使用一些JavaScript代码来回答,这些代码将继续运行到服务器上,以查看任务是如何执行的,如果需要的话,甚至可以使用websocket。

    首先要注意的是,Rails的操作不应该太重。当用户请求页面时,您应该立即为用户提供服务

    现在,有些情况下,您需要用户等待结果,在这种情况下,您可以始终使用WebSocket或

    现在,Ruby和Rails在线程方面有一个问题,您可以在“”中阅读

    您可以在Rails中使用的一个解决方案是使用Unicorn之类的服务器,它可以根据您的需要提供尽可能多的进程工作者,并且每个进程工作者将独立于其他进程工作者工作,Puma用于创建多线程,等等

    现在,如果您有一个操作是一个繁重的过程,您可能希望将工作延迟到一个进程池中,如
    delayed\u job
    。您甚至可以使用JavaScript创建一个漂亮的UI来获取作业状态并向用户显示进度。您可以使用RabbitMQ执行的任务池,其中后台的另一个进程可以侦听新消息并对其执行操作,甚至给出响应,等等


    请记住,大多数Web服务器都有一个客户端超时,您不希望用户等待一分钟或更长时间而没有响应,因此在操作完成时,使用流响应立即提供一些反馈总是很好的,或者使用一些JavaScript代码来回答,这些代码将继续访问服务器以查看任务的执行情况,如果需要,甚至可以使用websocket。

    我们需要更多信息来解决此问题。请求过程中发生了什么?如果涉及其他gem,它们是什么?我没有对默认rails添加任何修改(将config.threadsafe设置为false)。当控制器处理之前的请求时,nexts只是在等待。如果没有控制器中发生的事情的信息,就不可能给你准确的答案。所能做的只是猜测,这没有多大用处。你需要总结你的代码,这样我们就可以帮助找出慢点,然后尝试找到修复方法。我们需要更多的信息来解决这个问题。请求过程中发生了什么?如果涉及其他gem,它们是什么?我没有对默认rails添加任何修改(将config.threadsafe设置为false)。当控制器处理之前的请求时,nexts只是在等待。如果没有控制器中发生的事情的信息,就不可能给你准确的答案。所能做的只是猜测,这没有多大用处。您需要总结您的代码,这样我们就可以帮助您找出慢点,然后尝试找到修复方法。