2017-09-01 56 views
1

我必须使用处理两个并行作业的脚本。Ruby中的线程循环

剧本基本上预示了两个循环:

loop do 
    # do something 
    sleep 5 
end 

loop do 
    # do something else 
    sleep 10 
end 

所以,我想过要离开一个线程中的第一个循环,所以它运行并排与第二环。

我想是这样的:

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

loop do 
    # do something else 
    sleep 10 
end 

第一个循环会读取相关信息从Memcached的(通过达利宝石),并调用另一个类做了一些工作,但似乎不起作用properlty,不是我的方式预期:脚本锁定并不执行线程内的代码。

的问题,我认为它是因为我有两个循环之前创建一个连接:

@connection = ActiveRecord::Base.connection.raw_connection 

这种连接是通过第一循环使用的线程内,并通过第二循环。

那么,是否有一种安全的方式来创建这个作业同时运行?

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

非常感谢!

+1

>但似乎不起作用properlty,不是我的方式预期。 你能更具体吗?什么是不正确的方式? – nattfodd

+0

@nattfodd,对不起,添加了一些更多的信息。 –

回答

1

您可以使用Mutex这种情况的总结给出的有:

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

这是非常简单易用,你只需实例化一个互斥,然后调用它synchronize每当你想安全地访问数据库:

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

为什么thread.new在循环外部?我认为应该在循环内部,因为你想在多个线程之间同步,但是你的代码会创建一个无限期运行的单个线程。所以mutex.synchronize不能同步一个线程。或者我可能以错误的方式看到它。 –

+0

@RadaBogdan OP的问题是关于两个不应该彼此阻塞的不同循环。我省略了其他循环,这也将有线程和互斥#同步 –

+0

啊是的。这很有道理 –

-1

你可以尝试&断开连接到数据库的每个线程上,喜欢它的在麒麟做了例子:

Thread.new do 
    ActiveRecord::Base.establish_connection 
    loop do 
    # your requests 
    end 
    ActiveRecord::Base.connection.disconnect! 
end 
+2

您可能想要将连接代码放在循环之外,但仍在线程中。 – tadman