да хотел потестить работу библиотеки именно при множестве тредов. INCR
как команда редиса, понятное дело, работает нормально при
асинхронности. хотелось бы узнать какие еще могут быть подводные камни
(например кроме INCR)
On Jul 28, 10:32 pm, Andrew Rudenko <rudenk...@gmail.com> wrote:
> Ну так и напишите тест на то, что проверяете:
>
> @article = Article.create :title => "Simple test atomicity with multiple threads", :karma => 1
> karma = @article.karma
>
> @article.update_attribute :karma, karma + 1
> @article.update_attribute :karma, karma + 1
>
> @article.reload.karma.should == 3
>
> Угу, теперь сразу видно, что тест глупый и не пройдет. Можно поменять karma на @article.karma, тогда тест пройдет (, но менее глупым не станет.
>
> Давайте определимся, для начала, а что собственно вы хотите протестировать? Атомарные операции это фишка СУБД, а не драйвера или библиотеки (ну т.е. их можно сделать и на этом уровне, но это было бы несколько глупо, в редисе атомарный инкремент, на сколько мне известно, и так есть), работу драйвера / библиотеки при множестве тредов, умение драйвера / библиотеки посылать INCRBY при соответствующем вызове? В зависимости от ответа будут и соответствующие тесты. А на сколько INCRBY действительно атомарна при параллельных запросах нужно проверять в тестах самого редиса (собственно юнит-тестами в клиенте вы это и не проверите).
>
> On Jul 28, 2011, at 5:54 PM, germans_in_the_town wrote:
>
>
>
>
>
>
>
> > Да, непосредственно @article.karma + 1 - плохо. И как раз нужны тесты
> > для таких плохих случаев. Чтобы знать, что нужно поправить на
> > глубинном уровне (в самой библиотеке)
>
> > On Jul 28, 4:34 pm, "a.ognevsky" <a.ognev...@gmail.com> wrote:
> >> Я буквально вчера на сайте редиса игрался с обучающей консолькой и там рассказывалось, что @article.karma + 1 -- хреновый вариант, ибо он как раз не атомарный. Для этого там использовался increment.
>
> >> Или я что-то не так понял и путаю?
> >> --
> >> Andrey Ognevsky
>
> >> On Thursday, July 28, 2011 at 4:12 PM, germans_in_the_town wrote:
> >>> Добрый день.
>
> >>> Хотелось бы узнать у сообщества, какие есть способы для тестирования
> >>> атомичности (atomicity) данных в условиях множества асинхронных
> >>> запросов. На конкретном примере (orm для redis) я делаю так:
>
> >>>https://github.com/german/redis_orm/blob/master/test/atomicity_test.rb
> >>> :
>
> >>> require File.dirname(File.expand_path(__FILE__)) + '/test_helper.rb'
>
> >>> class Article < RedisOrm::Base
> >>> property :title, String
> >>> property :karma, Integer
> >>> end
>
> >>> describe "check atomicity" do
> >>> it "should properly increment property's value" do
> >>> @article = Article.new :title => "Simple test atomicity with
> >>> multiple threads", :karma => 1
> >>> @article.save
>
> >>> @threads = []
>
> >>> 50.times do |i|
> >>> @threads << Thread.new(i) do
> >>> @article.update_attribute :karma, (@article.karma + 1)
> >>> end
> >>> end
>
> >>> @threads.each{|thread| thread.join}
>
> >>> Article.first.karma.should == 51
> >>> end
> >>> end
>
> >>> Правильно ли это? Какие еще тесты можно добавить?
>
> >>> --
> >>> --
> >>> Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
> >>> FAQ группы находится по адресу:http://ru.wikibooks.org/wiki/RubyFAQ
>
> >>> Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
> >>> ror2ru@googlegroups.com
> >>> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-unsubscribe@googlegroups.com
> >>> Дополнительные варианты находятся на странице группыhttp://groups.google.com/group/ror2ru?hl=ru
>
> > --
> > --
> > Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
> > FAQ группы находится по адресу:http://ru.wikibooks.org/wiki/RubyFAQ
>
> > Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
> > ror2ru@googlegroups.com
> > Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-unsubscribe@googlegroups.com
> > Дополнительные варианты находятся на странице группыhttp://groups.google.com/group/ror2ru?hl=ru
--
--
Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
ror2ru@googlegroups.com
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-unsubscribe@googlegroups.com
Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru
Комментариев нет:
Отправить комментарий