我必须处理一个处理两个并行作业的脚本。
脚本基本上会有两个循环:
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,我试图改变这一点:(
非常感谢!
答案 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