gpt4 book ai didi

ruby - 进行网络请求时,我应该何时使用线程与进程?

转载 作者:太空宇宙 更新时间:2023-11-03 16:04:07 25 4
gpt4 key购买 nike

我正在开发一个 Ruby 脚本,它将向各种 API 发出数百个网络请求(通过 open-uri),我想并行执行此操作,因为每个请求都很慢, 和阻塞。

我一直在考虑使用 ThreadProcess 来实现这一点,但我不确定该使用哪种方法。

关于网络请求,什么时候应该使用Thread而不是Process,或者这无关紧要?

最佳答案

在进入细节之前,已经有一个库可以解决您的问题。 <强> Typhoeus 针对并行运行大量 HTTP 请求进行了优化,并且基于 libcurl 库。

Like a modern code version of the mythical beast with 100 serpent heads, Typhoeus runs HTTP requests in parallel while cleanly encapsulating handling logic.

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

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

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

我不建议只使用线程或只使用进程。如果您想自己实现,则应该同时使用两者。 Fork for every n requests a new processes that then again spawn number of threads to issue the HTTP requests.为什么?

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

关于ruby - 进行网络请求时,我应该何时使用线程与进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18216035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com