Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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 1.9.1中的本机线程,对我有什么好处?_Ruby_Concurrency - Fatal编程技术网

Ruby 1.9.1中的本机线程,对我有什么好处?

Ruby 1.9.1中的本机线程,对我有什么好处?,ruby,concurrency,Ruby,Concurrency,所以,Ruby 1.9.1现在是。Rails应该和它一起工作,慢慢地,gems被移植到它上面 它有本机线程和全局解释器锁(GIL) 既然有了GIL,那么本机线程比1.9.1中的绿色线程有什么好处吗 我认为最大的胜利是基于C的扩展。例如,MySQL适配器可以非常干净地运行长时间运行的数据库查询,而不会阻塞所有其他Ruby线程 1.9中的线程是本机线程,但它们已经“减速”,一次只允许运行一个线程。这是因为如果线程真的并行运行,它会混淆现有代码 优点: IO现在在线程中是异步的。如果一个线程阻塞IO

所以,Ruby 1.9.1现在是。Rails应该和它一起工作,慢慢地,gems被移植到它上面

它有本机线程和全局解释器锁(GIL)


既然有了GIL,那么本机线程比1.9.1中的绿色线程有什么好处吗

我认为最大的胜利是基于C的扩展。例如,MySQL适配器可以非常干净地运行长时间运行的数据库查询,而不会阻塞所有其他Ruby线程

1.9中的线程是本机线程,但它们已经“减速”,一次只允许运行一个线程。这是因为如果线程真的并行运行,它会混淆现有代码

优点:

  • IO现在在线程中是异步的。如果一个线程阻塞IO,那么另一个线程将继续,直到IO完成
  • C扩展可以使用真正的线程
缺点:

  • 任何不是线程安全的C扩展都可能存在使用线程时很难发现的问题。无法将扩展标记为线程不安全,以防止它与线程一起使用
  • 类名是相同的。本机线程类应该被命名为其他名称
  • 最糟糕的是,线程在不同平台上的工作方式不同!例如,
    priority()
    在Solaris、Windows和Linux之间是不同的。像
    loop{}
    这样的东西在Linux中运行良好,其他线程也有机会运行。但是,在Solaris线程上,线程占用了进程的时间,您永远不会退出