如何使用Ruby的Fibers实现并行任务?

NullVoxPopuli

我是光纤和EventMachine的新手,直到最近才发现Ruby是否具有任何并发​​功能(例如go-lang)时才发现有关光纤的知识。

对于使用Fiber的实际用例,似乎没有很多示例。

我确实设法找到了这个:https : //www.igvita.com/2009/05/13/fibers-cooperative-scheduling-in-ruby/(从2009年回来!!!)

它具有以下代码:

require 'eventmachine'
require 'em-http'
require 'fiber'

def async_fetch(url)
  f = Fiber.current
  http = EventMachine::HttpRequest.new(url).get :timeout => 10
  http.callback { f.resume(http) }
  http.errback { f.resume(http) }

  return Fiber.yield
end

EventMachine.run do
  Fiber.new{
    puts "Setting up HTTP request #1"
    data = async_fetch('http://www.google.com/')
    puts "Fetched page #1: #{data.response_header.status}"

    EventMachine.stop
  }.resume
end

很棒,异步GET请求!耶!!!但是...我实际上如何异步使用它?该示例除了创建包含的Fiber之外没有任何其他内容。

据我了解(不了解):

在调用f.resume之前,async_fetch一直处于阻塞状态。

f是当前的Fiber,它是在EventMachine.run块中创建的包装Fiber。

async_fetch将控制流返回给它的调用者?我不确定这是做什么的

包裹的纤维为什么最后会恢复呢?默认情况下是否暂停纤维?

在示例之外,我该如何使用纤维来表达,触发由键盘命令触发的一堆请求?

例如,例如:每次我输入字母时,我都会向Google发送请求?-通常这需要一个线程,主线程将告诉并行线程为每个请求启动一个线程。:-\

我是并发/ Fiber的新手。但是他们很有趣!

如果有人可以回答这些问题,将不胜感激!!!

基思·贝内特(Keith Bennett)

关于Ruby中的纤维很多困惑。光纤不是实现并发的工具;它们仅仅是以一种可以更清楚地表示正在发生的事情的方式来组织代码的方式。

在我看来,“纤维”的名称类似于“线程”,这加剧了混乱。

如果要实现真正的并发性,即在所有可用CPU上分配CPU负载,则可以使用以下选项:

在MRI Ruby中

使用fork等运行多个Ruby VM(即OS进程)。即使在Ruby中具有多个线程,GIL(全局解释器锁)也可以防止Ruby运行时使用多个CPU。

在JRuby中

与MRI Ruby不同,JRuby在分配线程时将使用多个CPU,因此您可以获得真正的并发处理。

如果您的代码大部分时间都在等待外部资源,那么您可能不需要这种真正的并发性。MRI线程或某种事件处理循环可能对您来说很好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何实现多线程并并行执行几个任务?

来自分类Dev

如何为并行任务实现协程

来自分类Dev

如何获得任务并行库使用的最大并行度?

来自分类Dev

Ruby:如何以最简单的方式并行运行任务

来自分类Dev

如何使用任务并行库管理任务列表

来自分类Dev

如何使用任务并行库发出许多HTTP请求

来自分类Dev

如何使用 OpenMP 部分并行执行独立任务

来自分类Dev

Scala Fork Join Pool,如何为没有并行结构的多个任务实现

来自分类Dev

使用声明式管道的waitUntil实现依赖并行任务的更优雅方法

来自分类Dev

如何制作并行任务并等待任务完成

来自分类Dev

如何使用递归扫描算法实现民间并行?

来自分类Dev

Python,如何实现并行过程

来自分类Dev

Spark如何在多核或超线程机器上的一项任务中实现并行性

来自分类Dev

使用 Kotlin 实现插件时,如何为 Gradle 扩展任务?

来自分类Dev

如何使用具有负载平衡和有限并行度的任务并行库(TPL)?

来自分类Dev

如何使用具有负载平衡和有限并行度的任务并行库(TPL)?

来自分类Dev

如何并行运行多个芹菜任务?

来自分类Dev

如何在Python中创建并行任务

来自分类Dev

使用Gradle运行并行测试任务

来自分类Dev

使用Bash并行运行任务

来自分类Dev

使用Gradle运行并行测试任务

来自分类Dev

使用任务并行库Task.WhenAny()时如何处理异常

来自分类Dev

c# - 如何使用任务在c#中并行运行n次调用相同的方法?

来自分类Dev

创建并行任务,如何限制新任务的创建?

来自分类Dev

如何实现并行作业和队列系统

来自分类Dev

如何使用numba并行?

来自分类Dev

如何在流编程中使用Highland.js的parallel()实现并行化?

来自分类Dev

如何使用递归在ruby中重新实现map方法?

来自分类Dev

如何在Ruby命令中并行启动

Related 相关文章

  1. 1

    如何实现多线程并并行执行几个任务?

  2. 2

    如何为并行任务实现协程

  3. 3

    如何获得任务并行库使用的最大并行度?

  4. 4

    Ruby:如何以最简单的方式并行运行任务

  5. 5

    如何使用任务并行库管理任务列表

  6. 6

    如何使用任务并行库发出许多HTTP请求

  7. 7

    如何使用 OpenMP 部分并行执行独立任务

  8. 8

    Scala Fork Join Pool,如何为没有并行结构的多个任务实现

  9. 9

    使用声明式管道的waitUntil实现依赖并行任务的更优雅方法

  10. 10

    如何制作并行任务并等待任务完成

  11. 11

    如何使用递归扫描算法实现民间并行?

  12. 12

    Python,如何实现并行过程

  13. 13

    Spark如何在多核或超线程机器上的一项任务中实现并行性

  14. 14

    使用 Kotlin 实现插件时,如何为 Gradle 扩展任务?

  15. 15

    如何使用具有负载平衡和有限并行度的任务并行库(TPL)?

  16. 16

    如何使用具有负载平衡和有限并行度的任务并行库(TPL)?

  17. 17

    如何并行运行多个芹菜任务?

  18. 18

    如何在Python中创建并行任务

  19. 19

    使用Gradle运行并行测试任务

  20. 20

    使用Bash并行运行任务

  21. 21

    使用Gradle运行并行测试任务

  22. 22

    使用任务并行库Task.WhenAny()时如何处理异常

  23. 23

    c# - 如何使用任务在c#中并行运行n次调用相同的方法?

  24. 24

    创建并行任务,如何限制新任务的创建?

  25. 25

    如何实现并行作业和队列系统

  26. 26

    如何使用numba并行?

  27. 27

    如何在流编程中使用Highland.js的parallel()实现并行化?

  28. 28

    如何使用递归在ruby中重新实现map方法?

  29. 29

    如何在Ruby命令中并行启动

热门标签

归档