• #5 楼 @ruohanc 直接回复在老帖子里了。

  • #10 楼 @ruohanc

    7 楼代码的问题不稳定的原因在于cv.signal if Thread.list.pop==Thread.current 这行的逻辑假定了,Thread.list 的最后一个 thread 是每次循环里最后一个得到锁的。

    不考虑代码很绕的问题,只是保证结果稳定的话,改个几行就出来了

    require 'minitest/autorun'
    require 'thread'
    
    class ConditionVarTest < Minitest::Test
    
      def main_method
    
        @thread<< Thread.new do
          @mutex.synchronize do
            @arr.each { |a|
              @value = a
              @runned = 0
              @cv.broadcast
              @cv.wait(@mutex)
            }
          end
        end
    
        @thread<< Thread.new do
          @mutex.synchronize do
            while @thread[0].alive?
              if @value
                @arr_mutex << @value
                @runned += 1
                @cv.signal if @runned == 3
              end
              @cv.wait(@mutex)
            end
          end
        end
    
        @thread<< Thread.new do
          @mutex.synchronize do
            while @thread[0].alive?
              if @value
                @arr_mutex << @value
                @runned += 1
                @cv.signal if @runned == 3
              end
              @cv.wait(@mutex)
            end
          end
        end
        @thread<< Thread.new do
          @mutex.synchronize do
            while @thread[0].alive?
              if @value
                @arr_mutex << @value
                @runned += 1
                @cv.signal if @runned == 3
              end
              @cv.wait(@mutex)
            end
          end
        end
        sleep 0.5
    
      end
    
      def setup
        @mutex = Mutex.new
        @cv = ConditionVariable.new
        @arr = [1, 2, 3, 4, 5, 6, 7, 8]
        @thread =[]
        @arr_mutex = []
        @expected_arr = @arr.reduce([]) { |memo, obj| 3.times { memo << obj }; memo }
      end
    
      def test_1
        main_method
        assert_equal(@arr_mutex, @expected_arr)
      end
    end
    
    
  • #3 楼 @so_zengtao 有 motion-cocoapods

  • #14 楼 @rubyonme 另外我认为 API 的可读性是指约定参数名称是否可读,并非参数值是否可读,否则把 ID base64 一遍的都该拖出去斩了

  • #14 楼 @rubyonme 传 id 验证简单还是座位验证简单? 座位验证还要读出来一个电影厅的座位表,parse 出来看是否有你传的座位号

  • #12 楼 @rubyonme 形势一边倒,你就该从自省是不是自己错了。 如果传 A-1 这样的还得验证这个座位在这个影院这个场次是否越界。。比方传 A-9999

  • @danielglh 勘误

    if you update any properties of the model that are use visible and should be involved in the revalidation, make sure you use update_attributes , save or save! instead of update_attribute, even if only one property is updated, because update_attribute doesn’t change updated_at
    
    update_attribute(name, value)
    Updates a single attribute and saves the record. This is especially useful for boolean flags on existing records. Also note that
    
    Validation is skipped.
    Callbacks are invoked.
    updated_at/updated_on column is updated if that column is available. # 这行
    Updates all the attributes that are dirty in this object.
    
    This method raises an ActiveRecord::ActiveRecordError if the attribute is marked as readonly.
    
  • 在 a 中 0 是个字符串,不是整数

    Hash[@b.zip(@a)].select{|_,v| v!= '0' }
    
  • 在玩,路过

  • #58 楼 @kingwkb 当然不一样,redis server 是单线程,并不意味着 redis 的 client 也必须是单线程。

  • #2 楼 @birbird gem 里这行执行早于你写的 prepend Mongoid::Document::ClassMethods.send(:include, CarrierWave::Mongoid)

    正确方式是在 initializer 里 Mongoid::Document::ClassMethods.send(:include, YOUR_MODULE_NAME)

  • #55 楼 @tency 多谢解释。

    第一点有影响但问题没那么严重,如果你指的是 GIL,那么 IO 并发还是没有太大影响的。 之前没有了解仔细看过 redis-rb 的代码,我觉得你说的第二点应该是最致命的。

    timeout 的问题在 go 系统中应该没有太大影响,sidekiq 一般一开始就初始化了 25 个左右的 worker,卡住一个就会损失一部分处理能力。Go 的话,轻量级进程卡住就卡住了,完全不影响其他请求的处理。

  • 你重写的部分仅是方法 mount_upload 的定义,问题他在你重写前已经调用完了。你可以直接一点,去 model 那边直接覆盖 那个 column 的 set 方法

  • @shawnyu @tency 以下引用自 sidekiq FAQ 页面,所以数据可能会有水分。

    The largest customers I'm aware of are processing ~500,000 jobs/min with Sidekiq with one customer reporting a peak of ~50,000 jobs/sec. Note that on dedicated hardware, Redis should be able to handle about 7000-8000 jobs/sec. After that, you'll need to shard your application to use multiple Redis instances or use multiple independent applications.

    我不是特别能理解,后台任务多是 IO 相关,但是为什么使用sidekiqgo-works会有这么大的差距。

    Queue 方面

    两者的 queue 都是利用了redisBRPOPLPUSH,这方面应该差距不大。

    Consumer 方面

    假设单台机器 8x25 个 thread,200 个 sidekiq 的 worker,并发上应该问题也不大。

    有没有可能是某些任务特别慢(比如网络连接有问题,单纯在等 timeout 时间),占住了 worker,或者其他什么原因呢?

    如果两位有时间,能不能介绍下相关情况,让我们选型时可以参考一下。

  • #44 楼 @tency 高峰时期远远不止每秒处理 800 个是指单台机器嘛?

  • 北京好多拆迁的 at 2015年07月31日

    错别字多到不忍直视。。。

  • #  这行覆盖了 ActiveRecord 里对列的读写方法
    attr_accessor :Idle, :Adapter1IP, :Adapter2IP, :Adapter3IP, :Adapter4IP, :Adapter5IP
    
  • count(*) 会使用 mysql 认为最快的 index,你可以用 force index (primary) 比较一下,我不认为你会得到更快的结果,这是 innodb 不是 myisam

  • #3 楼 @henrylin puts 打印出来的结果在 console 上

  • 可以试用一个月,不满意可以退款啊。

  • #5 楼 @chairy11 RubyMotion 本来就是 native 方案。。。

  • RubyMotion 的 一个深坑 at 2015年05月22日

    #3 楼 @luikore 对,之前条件反射一样把 foo.equalTo(bar)当成了单参数方法的调用。

  • RubyMotion 的 一个深坑 at 2015年05月21日

    #1 楼 @rei 对于 Objective-C 用户来说,文档没错,API 文档没必要解释内部实现。 不管是 equalTo 是一个接受一个参数的方法还是返回一个可以接受一个参数的 block,调用方式都是equalTo(someArgument)

    但是,RubyMotion 用户来使用 Objective-C 的开源库,有时就很坑,必须去看下源码才知道这是个直接的方法还是只是返回个 block

  • 可能不是语言层面,而是 ORM 层面吧,不知道 LZ 对 ActiveRecord 熟吗?

    我猜测慢的原因大致是 遇到 tree1.id == tree2.parent_id 的时候

    1. 在 php 这边,只是数组项的读取和比较
    2. 在 Ruby 这边,如果每次的比较都是直接调用 model 的 getter 方法来读取属性,那么就会为每条记录实例化一个 Tree 的 instance,慢就慢在了这里

    当然只是我的猜测

  • def self.xmethod(a)
      p "in x show a", a
    end
    
  • #5 楼 @excosy 字段默认 ActiveRecord 已经帮你定义了方法,你使用 attr_accessor 反而覆盖了本身的方法,所以删除就好。

  • 去掉这行 attr_accessor :id, :name, :title, :image, :full_price, :discount, :currency, :created_at, :updated_at

  • 看相应 gem 的 generator 部分

  • k 允许大于 n 吗?可以用 Ruby 内建方法吗?

    def rotate(nums, k)
      head = nums.shift(k%m)
      nums.push(*head)
    end