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
@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' }
在玩,路过
你重写的部分仅是方法 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 相关,但是为什么使用sidekiq
和go-works
会有这么大的差距。
两者的 queue 都是利用了redis
的BRPOPLPUSH
,这方面应该差距不大。
假设单台机器 8x25 个 thread,200 个 sidekiq 的 worker,并发上应该问题也不大。
有没有可能是某些任务特别慢(比如网络连接有问题,单纯在等 timeout 时间),占住了 worker,或者其他什么原因呢?
如果两位有时间,能不能介绍下相关情况,让我们选型时可以参考一下。
错别字多到不忍直视。。。
# 这行覆盖了 ActiveRecord 里对列的读写方法
attr_accessor :Idle, :Adapter1IP, :Adapter2IP, :Adapter3IP, :Adapter4IP, :Adapter5IP
count(*)
会使用 mysql 认为最快的 index,你可以用 force index (primary)
比较一下,我不认为你会得到更快的结果,这是 innodb 不是 myisam
可以试用一个月,不满意可以退款啊。
可能不是语言层面,而是 ORM 层面吧,不知道 LZ 对 ActiveRecord 熟吗?
我猜测慢的原因大致是 遇到 tree1.id == tree2.parent_id 的时候
当然只是我的猜测
def self.xmethod(a)
p "in x show a", a
end
去掉这行
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