2010-07-07 15 views
5

chciałbym wykonać pewne metody niepodzielność z Ruby, według http://en.wikipedia.org/wiki/Atomicity_(database_systems)Napisz operację atomową

Na przykład, jeśli mam:

a = 30 
b = 75 

Chciałbym móc zrobić coś takiego:

atomic_operation do 
    a += 10 
    b -= 39 
end 

Czy istnieje macierzysty moduł w Rubim 1.9, który pozwala na taki proces? Jeśli to możliwe, chciałbym to zrobić bez użycia wtyczki. Wielkie dzięki!

+0

Spójrz na https://github.com/headius/ruby-atomic i wewnątrz http://pragprog.com/book/jsthreads/working-with-ruby- wątki –

Odpowiedz

7

To naprawdę zależy od zakresu, który cię interesuje, co do właściwych narzędzi do pracy. Jeśli chcesz wykonać operację atomową w bazie danych, to prawdopodobnie sterownik bazy danych (jeśli jest dobry) lub baza danych obsługuje tę opcję) oferuje sposób wykorzystania transakcji bazy danych do aktualizacji atomowej.

Jeśli mówisz o wielowątkowej aplikacji Ruby, która próbuje zaktualizować udostępnione zasoby, atomowo i wątkowo, Ruby udostępnia klasy Mutex i ConditionVariable, które pomogą ci w tym zakresie. (Więcej informacji:)

+0

Sprawdź również klasy 'Monitor' i' MonitorMixin', które są częścią standardowych bibliotek Ruby. –

4

W artykule na temat baz danych, zgaduję, że pytasz w tym kontekście.

Jeśli używasz Railsów, używasz transactionmethods z ActiveRecord.

Account.transaction do 
    @alice.withdraw!(100) 
    @bob.deposit!(100) 
end 

Jeśli używasz spoza szyny, musisz pracować z tym, co zapewnia biblioteka sterowników baz danych. Sprawdź implementation of transaction na Railsach, aby dowiedzieć się, jak można to zrobić.

2

To, czego potrzebujesz, mój przyjaciel, to pamięć transakcyjna oprogramowania. Wypróbuj implementację STM, z którą grałem w JRuby (Musisz sprawdzić kod w repo, ponieważ nie pakowałem go do wydania).

Sprawdź również atomowy Ruby, pracuję nad http://github.com/saivenkat/ruby-atomic. Daje operacje CAS na MRI. Jest to nieco niższy poziom, ale pomoże ci z tym samym problemem. Nie napisałem pamięci transakcyjnej dla MRI, ale z infrastrukturą CAS to nie będzie długo :)

P.S Stackoverflow nie pozwala mi opublikować więcej niż jednego linku, ponieważ nie korzystałem z jego systemu. Więc kasy multiwersie witryny w codehaus dla STM w JRuby

--Sai Venkat

+0

+1 dla STM będącego tym, czego potrzebuje PO. Nie próbowałem jednak biblioteki. –

6

Klasa Mutex jest dostępny w 1,9 starcie (i require('thread') w 1.8) i pozwala na zablokowanie działania w kontekście.

# Typically defined in the object initializer 
@lock = Mutex.new 

# Then in your code 
@lock.synchronize do 
    a += 10 
    b -= 39 
end 

To gwarantuje, że blok dany do synchronizacji Mutex # jest uruchamiany sekwencyjnie.

Dziennik doc jest tutaj: http://rubydoc.info/stdlib/core/1.9.2/Mutex

+0

Najnowszy dokument znajduje się tutaj: https://ruby-doc.org/core-2.4.1/Thread/Mutex.html – ronen