【发布时间】:2013-01-16 03:41:52
【问题描述】:
我的假设:
MRI ruby 1.8.X 没有原生线程,只有绿色线程。
操作系统不知道这些绿色线程。
发出大量 IO 操作应暂停整个进程,直到发出适当的 IO 中断。
有了这些,我创建了一个simple ruby program,它执行以下操作:
启动一个打印“工作!”的线程每秒。
发出 IO 请求以在“主”线程上复制一个大 (1gb) 文件。
现在有人会猜测,作为操作系统不可见的绿色线程,它会将整个进程置于“阻塞”队列和“工作!”队列中。绿色线程不会执行。令人惊讶的是,它有效:S
有人知道那里发生了什么吗?谢谢。
【问题讨论】:
-
我不知道 ruby,但是 javascript 是单线程的并且具有非阻塞 IO,当使用服务器端 javascript(例如 node.js)时,发出 fs.readFile 不会阻止执行,而是接受回调参数,当读取完成时调用回调函数。
-
如果已知线程阻塞了 I/O 操作,那么 Ruby 解释器不能在此期间简单地调度另一个线程吗?
-
@maerics 这不取决于 ruby,请求 I/O 必须通过操作系统完成,当操作系统注意到需要阻止某个进程等待 I/O 时,它将暂停它。跨度>
-
@maerics 是对的。被阻塞的线程在等待响应时会休眠,同时解释器会调度另一个线程。
标签: ruby multithreading concurrency io