Ruby中的线程循环

时间:2017-09-01 15:49:09

标签: ruby multithreading thread-safety

我必须处理一个处理两个并行作业的脚本。

脚本基本上会有两个循环:

loop do
  # do something
  sleep 5
end

loop do
  # do something else
  sleep 10
end

所以,我想把第一个循环放在一个Thread中,所以它与第二个循环并排运行。

我尝试过类似的事情:

Thread.new do
  loop do
    # do something
    sleep 5
  end
end

loop do
  # do something else
  sleep 10
end

第一个循环将从Memcached(通过Dalli Gem)读取信息,并调用另一个类来完成一些工作,但它似乎不能正常工作,而不是我期望的方式:脚本锁定并且不执行内部的代码线程。

问题,我认为是因为我在两个循环之前创建了连接:

@connection = ActiveRecord::Base.connection.raw_connection

第一个循环,线程内部和第二个循环使用此连接。

那么,有一种安全的方法可以创建同时运行的作业吗?

线程在我的公司中是一种tabboo,我试图改变这一点:(

非常感谢!

1 个答案:

答案 0 :(得分:1)

您可以使用Mutex。给出的摘要:

  

Mutex实现了一个简单的信号量,可用于协调对来自多个并发线程的共享数据的访问

使用起来非常简单,只需要实例化互斥锁,然后在想要安全访问数据库时调用synchronize

require 'mutex'
semaphore = Mutex.new
Thread.new do
  loop do
    semaphore.synchronize do
      # do something
    end
    sleep 5
  end
end