<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>vianvio (Vian)</title>
    <link>https://ruby-china.org/vianvio</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Flask 代码执行效率问题</title>
      <description>&lt;p&gt;近期刚开始用 flask，所以遇到些奇怪问题想请教一下。&lt;/p&gt;

&lt;p&gt;从别人那里拿到了数据分析的代码，直接 console 里运行.py 文件的情况下，运行时间在 1～2 秒
而我将这段代码放到 flask 里，写了一个路由，间接执行这段代码的时候，运行时间是之前的 6～10 倍。。。&lt;/p&gt;

&lt;p&gt;为了确保执行情况一致，我将用到的数据 hardcode 在代码中，并且在 flask 的 service 调用时，用 multiprocess 新建了一个单独进程去跑，结果还是相差 6～10 倍。&lt;/p&gt;

&lt;p&gt;我有将时间 log 打在最耗时的代码前后，发现直接 python xxx.py 的运行情况下耗时在 15000mircoseconds 左右，而通过 service，会高出 10 倍到 20 倍。&lt;/p&gt;

&lt;p&gt;单独开进程跑的情况下应该已经将 flask 框架相关的影响去除了吧？感觉理论上应该和 console 里执行是一样的，可是为什么还是差那么多？
还请高手指点个方向，谢谢！&lt;/p&gt;</description>
      <author>vianvio</author>
      <pubDate>Tue, 24 Mar 2015 11:53:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/24811</link>
      <guid>https://ruby-china.org/topics/24811</guid>
    </item>
    <item>
      <title>感觉 oAuth 整体好复杂，纯应用角度需要了解哪些？</title>
      <description>&lt;p&gt;rt，最近做项目架构准备前段用 angularjs 和 nodejs 搭配，然后 call 后端其他 server 提取数据。这其中感觉应该引入认证，于是就开始了解 oAuth2.但是网上找到文章都好复杂，可是很少看到简单实现的样例。
目前了解下来，作为 client，我只需要请求一个 token，然后每次把 token 放在 header 里就 OK 了对吧？
作为 server 端，大多数的框架都有比较完整的 server 实现包对吗？
还请大神指点一下方向，多谢&lt;/p&gt;</description>
      <author>vianvio</author>
      <pubDate>Thu, 15 Jan 2015 14:26:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/23756</link>
      <guid>https://ruby-china.org/topics/23756</guid>
    </item>
    <item>
      <title>关于 active resource</title>
      <description>&lt;p&gt;最近和朋友准备一起合作一个项目，由于语言问题，决定由 java 负责数据部分，提供数据读写接口。再由 ruby 完成 C 和 V 层的处理。但是遇到的问题就是这需要将 rails 框架拆开。看了一些资料以后找到了 active resource 这个 gem，但是却被 rails4 移除了。想请问下移除了是有其他模块代替这项功能了嘛？还是说由于这个功能的独立性，所以单独分离更适合？&lt;/p&gt;</description>
      <author>vianvio</author>
      <pubDate>Tue, 02 Dec 2014 14:14:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/22972</link>
      <guid>https://ruby-china.org/topics/22972</guid>
    </item>
    <item>
      <title>关于多线程的基础问题</title>
      <description>&lt;p&gt;小弟虽然写了挺久代码，但是多线程一直未涉及，总觉得很神秘。现在自学 ruby 写了一个数据分析的程序，因为数据需要不断重复循环搜索和总结，所以想着正好试着用上多线程。
于是就遇到基础问题了，首先是变量共享问题，比如下列代码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="n"&gt;arrThread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

        &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;"j = &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

        &lt;span class="n"&gt;arrThread&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Thread&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;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;"k = &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="c1"&gt;#hold the main thread&lt;/span&gt;
    &lt;span class="n"&gt;arrThread&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一开始我没有加入 k = j 这句，发现输出全是重复的，于是我意识到可能是变量 j 在 Thread.new 的时候已经变了的关系，所以我尝试在 block 里增加一个 k。可是结果任然存在重复的情况。。。为什么在各自 block 中的 k 也是共享的而不是每个 block 私有的？&lt;/p&gt;

&lt;p&gt;第二个问题是这样的，同样，上代码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;arrN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="n"&gt;rangeSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iIndex&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;
&lt;span class="n"&gt;arrDataForSearch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;arrayToCreate&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;iIndex&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;rangeSize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&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;v&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;arrN&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ColorHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arrDataForSearch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;t1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Thread&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;arrN&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ColorHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arrDataForSearch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;))}&lt;/span&gt;
    &lt;span class="n"&gt;t2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Thread&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;arrN&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ColorHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arrDataForSearch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;))}&lt;/span&gt;
    &lt;span class="n"&gt;t3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Thread&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;arrN&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ColorHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arrDataForSearch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;))}&lt;/span&gt;
    &lt;span class="n"&gt;t4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Thread&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;arrN&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ColorHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arrDataForSearch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;))}&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码中我希望将原本逐个进入 findN 方法的循环，在单次循环中开 4 个额外线程并行进入。findN 方法是对整个 arrDataForSearch 数组做遍历并且匹配查找，没有数据修改。
结果发现并行确实存在，可是效率上并没有提升。单线程走完基本上在 1 分 05 秒，而多线程发挥不稳定，有时在 1 分，绝大多数在 1 分 20 秒，反而慢了。。
所以感觉是自己对多线程的理解和思路上肯定有问题，特请赐教，谢谢！&lt;/p&gt;</description>
      <author>vianvio</author>
      <pubDate>Tue, 14 Oct 2014 10:43:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/22027</link>
      <guid>https://ruby-china.org/topics/22027</guid>
    </item>
    <item>
      <title>ruby 中循环的理解</title>
      <description>&lt;p&gt;新人刚接触 ruby 半个月，在啃英文原版书。
看了 ruby 中各种颠覆以往概念的循环后，有一点见解想确认一下，顺便加深一些对 ruby 的理解。&lt;/p&gt;

&lt;p&gt;在其他语言中往往是在需要遍历的时候采取当即使用循环。
而 ruby 中 blocks 的存在，是否变成在设计初期，就站在一个高度上考虑全局循环的可能。
换句话说，在设计对象时将核心的循环设计在基础方法里，后面的业务功能只是在反复调用这个核心循环。
也就是说其他语言中一个系统可能有几百行 for()，而在 ruby 里虽然有几百次循环，而实际相当于 for() 的，只有 1 处？&lt;/p&gt;

&lt;p&gt;表达的可能有点奇怪，还请见谅。&lt;/p&gt;</description>
      <author>vianvio</author>
      <pubDate>Wed, 21 May 2014 14:47:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/19445</link>
      <guid>https://ruby-china.org/topics/19445</guid>
    </item>
  </channel>
</rss>
