Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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 在进行网络请求时,何时应使用线程与进程?_Ruby_Parallel Processing - Fatal编程技术网

Ruby 在进行网络请求时,何时应使用线程与进程?

Ruby 在进行网络请求时,何时应使用线程与进程?,ruby,parallel-processing,Ruby,Parallel Processing,我正在开发一个Ruby脚本,它将向各种API发出数百个网络请求(通过openURI),我希望并行执行,因为每个请求都很慢,而且阻塞 我一直在考虑使用线程或进程来实现这一点,但我不确定使用哪种方法 关于网络请求,我什么时候应该在进程上使用线程,还是不要紧?在详细介绍之前,已经有一个库解决了您的问题经过优化,可并行运行大量HTTP请求,并基于libcurl库 就像一个现代代码版本的神话野兽和100条蛇 头,typhous在干净的同时并行运行HTTP请求 封装处理逻辑 线程将与应用程序在同一进程中运行

我正在开发一个Ruby脚本,它将向各种API发出数百个网络请求(通过
openURI
),我希望并行执行,因为每个请求都很慢,而且阻塞

我一直在考虑使用
线程
进程
来实现这一点,但我不确定使用哪种方法


关于网络请求,我什么时候应该在
进程上使用
线程
,还是不要紧?

在详细介绍之前,已经有一个库解决了您的问题经过优化,可并行运行大量HTTP请求,并基于libcurl库

就像一个现代代码版本的神话野兽和100条蛇 头,typhous在干净的同时并行运行HTTP请求 封装处理逻辑

线程将与应用程序在同一进程中运行。因为Ruby 1.9本机线程被用作底层实现。资源可以很容易地跨线程共享,因为它们都可以访问应用程序的相互状态。然而,问题是在大多数Ruby实现中无法利用CPU的多核

Ruby使用全局解释器锁(GIL)。GIL是一种锁定机制,用于确保相互状态不会因来自不同线程的并行修改而损坏。其他Ruby实现如JRuby、Rubinius或MacRuby提供了一种没有GIL的方法

进程彼此独立运行。进程不共享资源,这意味着每个进程都有自己的状态。如果您希望在请求之间共享数据,这可能是一个问题。进程还分配自己的内存堆栈。您仍然可以通过使用RabitMQ这样的消息传递总线来共享数据

我不建议只使用线程或进程。如果您想自己实现这一点,您应该同时使用这两种方法。Fork for every n请求一个新的进程,然后再次生成多个线程来发出HTTP请求。为什么?


如果为每个HTTP请求分叉另一个进程,这将导致进程过多。尽管您的操作系统可能能够处理此问题,但开销仍然巨大。有些HTTP请求可能会很快完成,所以为什么还要麻烦一个额外的进程,只需在另一个线程中运行它们。

如果您计划生成数百个HTTP请求,
进程
似乎无法启动。