From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS4713 221.184.0.0/13 X-Spam-Status: No, score=-3.9 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from neon.ruby-lang.org (neon.ruby-lang.org [221.186.184.75]) by dcvr.yhbt.net (Postfix) with ESMTP id E7E0D200B9 for ; Sat, 5 May 2018 02:39:12 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id 27136120A72; Sat, 5 May 2018 11:39:09 +0900 (JST) Received: from o1678948x4.outbound-mail.sendgrid.net (o1678948x4.outbound-mail.sendgrid.net [167.89.48.4]) by neon.ruby-lang.org (Postfix) with ESMTPS id 1A3A1120A3C for ; Sat, 5 May 2018 11:39:04 +0900 (JST) Received: by filter0007p3mdw1.sendgrid.net with SMTP id filter0007p3mdw1-17394-5AED1945-23 2018-05-05 02:39:01.590503221 +0000 UTC Received: from herokuapp.com (ec2-54-196-55-8.compute-1.amazonaws.com [54.196.55.8]) by ismtpd0010p1iad2.sendgrid.net (SG) with ESMTP id 7F50MhiWTnaRIpqUjKoU8Q Sat, 05 May 2018 02:39:01.348 +0000 (UTC) Date: Sat, 05 May 2018 02:39:02 +0000 (UTC) From: samuel@oriontransfer.org To: ruby-core@ruby-lang.org Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 62235 X-Redmine-Project: ruby-trunk X-Redmine-Issue-Id: 14736 X-Redmine-Issue-Author: ioquatix X-Redmine-Sender: ioquatix X-Mailer: Redmine X-Redmine-Host: bugs.ruby-lang.org X-Redmine-Site: Ruby Issue Tracking System X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-SG-EID: ync6xU2WACa70kv/Ymy4QrNMhiuLXJG8OTL2vJD1yS4bSoihRAqPjxgPixWvGx0xDTvlgmDrkDfd4/ +Fb8YZ77AoJnVVEF89vNQC/e/nGFjbcoDDDqZ04p4lEB9MuQdaVebq5dP0bgvwbymkAN1wcy56K3dV pcuaul+2FcosxQxOBVQC7ysOs5TYUy2XfhBhYpNNCBI3/C1/Kzv+WDVGug== X-ML-Name: ruby-core X-Mail-Count: 86881 Subject: [ruby-core:86881] [Ruby trunk Feature#14736] Thread selector for flexible cooperative fiber based concurrency X-BeenThere: ruby-core@ruby-lang.org X-Mailman-Version: 2.1.15 Precedence: list Reply-To: Ruby developers List-Id: Ruby developers List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ruby-core-bounces@ruby-lang.org Sender: "ruby-core" Issue #14736 has been updated by ioquatix (Samuel Williams). I did some preliminary test. I don't know if there is a standard fiber benchmark/test in Ruby. I used a simple message passing ring benchmark I found. ``` ^_^ > ./build/bin/ruby ./fiber_benchmark.rb 10000 1000 setup time for 10000 fibers: 0.159232 execution time for 1000 messages: 13.581069 ^_^ > ./fiber_benchmark.rb 10000 1000 setup time for 10000 fibers: 0.153677 execution time for 1000 messages: 14.630562 ``` It was about 8% faster. I feel like this is still slow. I will need to investigate further. That being said, I would like to know if this is of interest to Ruby, otherwise I won't invest more time into it. ---------------------------------------- Feature #14736: Thread selector for flexible cooperative fiber based concurrency https://bugs.ruby-lang.org/issues/14736#change-71842 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- Ruby concurrency can be greatly enhanced by concurrent, deterministic IO. Fibers have been shown many times to be a great abstraction for this purpose. The retain normal code flow and don't require any kind of Thread synchronisation. They are enjoyable to write code with because you don't have to concern yourself with thread synchronisation or other complicated issues. The basic idea is that if some operation would block, it yields the Fiber, and other Fibers within the thread can continue to execute. There are a number of ways to implement this. Here is a proof of concept to amend the existing `rb_io_wait_readable`/`rb_io_wait_writable`. https://github.com/ruby/ruby/pull/1870 This design minimally affects the Ruby implementation and allows flexibility for selector implementation. With a small amount of work, we can support EventMachine (65 million downloads), NIO4r (21 million downloads). It would be trivial to back port. This PR isn't complete but I am seeking feedback. If it's a good idea, I will do my best to see it through to completion, including support for EventMachine and NIO4r. -- https://bugs.ruby-lang.org/