<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>nikoloss (Biligay)</title>
    <link>https://ruby-china.org/nikoloss</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>用 Go 的方式写 Ruby！</title>
      <description>&lt;p&gt;先直接看两段代码吧。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Async&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
  &lt;span class="s2"&gt;"ok"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用 Go 写的话&lt;/p&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="s"&gt;"ok"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="https://github.com/socketry/async" rel="nofollow" target="_blank" title=""&gt;Async&lt;/a&gt;这个方案比之前的 EM 方案要优雅不少，而且基础建设比较完善了比如 task.with_timeout do 可以用来控制超时，task.stop 可以停止，而且这些事件是自动传播子协程的，比 golang 的 context 带着到处跑要优雅。
另外生态的基础建设也都具备了，比如&lt;a href="https://github.com/socketry/async-io" rel="nofollow" target="_blank" title=""&gt;async-io&lt;/a&gt;和&lt;a href="https://github.com/socketry/async-process" rel="nofollow" target="_blank" title=""&gt;async-process&lt;/a&gt;，更有一个杀手级 web 应用&lt;a href="https://github.com/socketry/falcon" rel="nofollow" target="_blank" title=""&gt;falcon&lt;/a&gt;，我已经在生产环境中使用了，性能非常不错呀。开发框架用的&lt;a href="https://github.com/jeremyevans/roda" rel="nofollow" target="_blank" title=""&gt;roda&lt;/a&gt;。
falcon 在多进程*单线程的情况下能跑到 1w5 左右的 qps&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;注意：如果使用了 falcon，那么 roda 中的代码要写成 async 协程，用 wait 等待结果，否则会大量报错 peer connection error
可以改成如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Roda&lt;/span&gt;
  &lt;span class="n"&gt;route&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt; &lt;span class="s2"&gt;"api"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt; &lt;span class="s2"&gt;"case"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;case_id&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
          &lt;span class="no"&gt;Async&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
            &lt;span class="no"&gt;Case&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;case_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="s2"&gt;"ok"&lt;/span&gt;
          &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>nikoloss</author>
      <pubDate>Fri, 24 Apr 2020 16:24:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/39795</link>
      <guid>https://ruby-china.org/topics/39795</guid>
    </item>
    <item>
      <title>用 ruby 实现的七牛同步盘</title>
      <description>&lt;p&gt;老铁们给点意见建议？&lt;a href="https://github.com/nikoloss/lubi" rel="nofollow" target="_blank"&gt;https://github.com/nikoloss/lubi&lt;/a&gt;&lt;/p&gt;</description>
      <author>nikoloss</author>
      <pubDate>Wed, 24 May 2017 17:24:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/33063</link>
      <guid>https://ruby-china.org/topics/33063</guid>
    </item>
  </channel>
</rss>
