Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?

Fiberに関するこんな記事をみて、 そういえば以前30分でわかるcallccの使い方で、 callccの代表的な使い方は * (A) 処理の中断/再開 (generator, wait_ok) * (B) 処理のやり直し (amb, ppp) の2通りが挙げられる。 callccが危険なのは(B)ができてしまうからだ。じゃあ(A)の機能だけなら残してもいいかも?ということで、Ruby 1.9ではFiberという機能が検討されている。 と書いてあったのを思い出して、「Fiberはcallccの抽象化ってことか……じゃあFiberのコードはcallccで書き直せるのかな?」 と思い試してみました。 Fiberのコード はこべにっき#より、改変 require 'fiber' def count() n = 0 Fiber.new do loop do Fiber.yield n n += 1
グリーンスレッド(英: green threads)とは、コンピュータプログラミングにおいて、オペレーティングシステムではなく、ランタイムライブラリや仮想マシン (VM) によってスケジュールされるスレッドである。グリーンスレッドはネイティブのOSの機能に依存せずに並行性を実現するほか、カーネル空間ではなくユーザー空間で管理されるためネイティブスレッドがサポートされていない環境でも動作しうる。 マルチコアプロセッサのシステムでは、ネイティブスレッドの実装は処理を複数のプロセッサに割り当てることができる。これはグリーンスレッドの実装では不可能である。このような環境ではネイティブスレッドに明らかな利点がある。しかし、ユニプロセッサのシステムでは、最も効率のよいモデルが何なのか、いまだ明確な答えはない[1]。 また、ネイティブスレッド(あるいはマルチプロセス処理)とグリーンスレッドを併用すること
[edit] 要約 スレッドを表すクラスです。スレッドとはメモリ空間を共有して同時に実行される制御の流れです。 Thread を使うことで並行プログラミングが可能になります。 実装 ネイティブスレッドを用いて実装されていますが、現在の実装では Ruby VM は Giant VM lock (GVL) を有しており、同時に実行されるネイティブスレッドは常にひとつです。ただし、IO 関連のブロックする可能性があるシステムコールを行う場合には GVL を解放します。その場合にはスレッドは同時に実行され得ます。また拡張ライブラリから GVL を操作できるので、複数のスレッドを同時に実行するような拡張ライブラリは作成可能です。 スケジューリング Ruby のスレッドスケジューリングはネイティブスレッドのそれを利用しています。よって詳細はプラットフォームに依存します。 メインスレッド プログラムの開
[edit] 要約 ノンプリエンプティブな軽量スレッド(以下ファイバーと呼ぶ)を提供します。他の言語では coroutine あるいは semicoroutine と呼ばれることもあります。 Thread と違いユーザレベルスレッドとして実装されています。 Thread クラスが表すスレッドと違い、明示的に指定しない限りファイバーのコンテキストは切り替わりません。またファイバーは親子関係を持ちます。Fiber#resume を呼んだファイバーが親になり呼ばれたファイバーが子になります。親子関係を壊すような遷移(例えば自分の親の親のファイバーへ切り替えるような処理)はできません。例外 FiberError が発生します。できることは Fiber#resume により子へコンテキストを切り替える Fiber.yield により親へコンテキストを切り替える の二通りです。この親子関係は一時的なも
All Elixir code runs inside lightweight threads of execution (called processes) that are isolated and exchange information via messages: current_process = self() # Spawn an Elixir process (not an operating system one!) spawn_link(fn -> send(current_process, {:msg, "hello world"}) end) # Block until the message is received receive do {:msg, contents} -> IO.puts(contents) end Due to their lightweigh
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く