2017-09-01 52 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