我正在处理一个Ruby脚本,该脚本将向各种API发出数百个网络请求(通过open-uri
),并且我希望并行执行此操作,因为每个请求都很慢,和阻止。
我一直在考虑使用Thread
或Process
来实现这一目标,但我不确定使用哪种方法。
关于网络请求,我应该何时使用Thread
而不是Process
,还是不重要?
答案 0 :(得分:2)
在详细介绍之前,已经有一个解决您问题的库。 Typhoeus 经过优化,可并行运行大量HTTP请求,并基于libcurl库。
像100蛇的神话野兽的现代代码版本 head, Typhoeus 干净地并行运行HTTP请求 封装处理逻辑。
主题将在与您的应用程序相同的过程中运行。由于Ruby 1.9本机线程用作底层实现。可以跨线程轻松共享资源,因为它们都可以访问应用程序的相互状态。但问题是,大多数Ruby实现都无法利用CPU的多个内核。
Ruby使用全局解释器锁(GIL)。 GIL是一种锁定机制,用于确保由于来自不同线程的并行修改而不会破坏相互状态。其他Ruby实现,如JRuby,Rubinius或MacRuby,提供了一种没有GIL的方法。
进程彼此分开运行。进程不共享资源,这意味着每个进程都有自己的状态。如果您想在请求中共享数据,这可能是一个问题。进程还分配自己的内存堆栈。您仍然可以使用像RabitMQ这样的消息传递总线来共享数据。
我不建议仅使用线程或仅使用进程。如果你想自己实现,你应该同时使用它们。每个 n 的fork请求一个新进程,然后再生成许多线程来发出HTTP请求。为什么呢?
如果为每个HTTP请求分叉另一个进程,这将导致过多的进程。虽然您的操作系统可能能够处理这个问题,但开销仍然很大。有些HTTP请求可能会很快完成,所以为什么要花费额外的进程,只需在另一个线程中运行它们。