All streams
Search
Write a publication
Pull to refresh
4
0
Amir Mamedov @Tenkoff

User

Send message
Соглашусь что блокируется, любое исполнение кода сразу после join до завершение треда, НО другие треды не блокируются.

Такова модель нативных тредов в руби.
p Thread.list[0] # Берем список тредов, а точнее первый
p Thread.main # Берем главный тред
p Thread.current # Берем текущий тред
# Как бы все равны
t = Thread.main.group # Берем группу основного треда

$mutex = Mutex.new
p 'Thread #1 define start'
t1 = Thread.new {
p ' Thread #1 start'
1_000_000.times{
'string1'.to_sym
}
p ' Thread #1 end'
}
p 'Thread #1 define end'
p 'Thread #2 define start'

t2 = Thread.new {
p ' Thread #2 start'
1_000_000.times{
'string2'.to_sym
}
p ' Thread #2 end'
}
p 'Thread #2 define end'

p 'Thread #1 add start'
t.add(t1)
p 'Thread #1 add end'

p 'Thread #2 add start'
t.add(t2)
p 'Thread #2 add end'

=begin
Результат без join будет одинаков
Но если добавить операцию требующую большего времени на выполнение, чем остальные треды
=end

6_000_000.times{
'string3'.to_sym
}

# Все будет хорошо

=begin
Объясните тогда следующий код
=end

list = []
list << Thread.new{
loop{
1_000_000.times{ 'string1'.to_sym }
p 'tick #1'
}
}
list << Thread.new{
loop{
1_000_000.times{ 'string2'.to_sym }
p 'tick #2'
}
}
list.each{|t| t.join }

#Работают оба треда

Вы запутались!

1. sleep — не хитрый чит запускающий треды, вы просто даете время тредам уложиться в указанное в sleep время
2. join — важен, он запрещает руби завершать выполнение программы, до тех пор пока указанные с помощью метода join треды живы и работают

Отсюда делаем выввод, в действительности треды запускаются и без метода join, но так как вы не сказали руби, что нужно подождать выполнения ваших тредов, то они завершаются мгновенно.

Именно для этого и нужен метод join.

p.s. Удачного распараллеливания :)
Интересно, а что будет если надеть эту перчатку на него, рекурсия будет?
Я так полагаю, что и в AR STI реализован на varchar стыках?
Они обозвали хабр — забором!
Это скорее вопрос к руководителям проекта, нежели к разработчикам.
p.s. Если бы все разработчики об этом думали, был бы мир во всем мире :)
Как-то так:

1. Архитектура, должна быть приспособлена к горизонтальному масштабированию, что бы можно было поставить +1 сервер, развернуть там еще один бекенд и вперед, т.к. вертикальное масштабирование имеет разумные пределы.
2. В качестве фронтенда лучше использовать ngnix он довольно шустро умеет отдавать статику и не плохо справляется с fcgi проксированием.
3. Модули на c\c++ приятней писать под apache, много документации, большое комьюнити, куча примеров и много почти готовых решений, код которых можно использовать для своего велосипеда.
5. Лучше использовать fastcgi, он быстрей.
6. У fastcgi — есть один нездоровый косяк, по мнению многих, до тех пор пока бекенд на другом конце пайпа не отдаст вам данные, все запросы попадают в очередь и ждут смиренно пока не будет удачного ответа или же вылета по таймауту.
7. Для того, что бы fastcgi выдавал вам максимальные возможности, ваше приложение лучше сделать атомарным, запустить несколько процессов и забить их блоком в тот же ngnix для проксирования.
А еще нам не говорит, что нельзя скафолдить именами которые рельсы не смогут просклонять в множественное число.

За 2 дня, был дан только один работающий вариант вместо news использовать post (прямо из «учебника»).
Я перерыл довольно много форумов и книг (включая платные) нигде нет ни одного примера использования слова для модели и для контроллера, которые были бы несклоняемы — прям проказа рельсоводов какая-то.

Как не крути, что-то да отваливается, т.е. или скафолдь с валидными именами или пиши все ручками (Not A DRY).
Лично у меня или отваливалась работа метода в контроллере из-за неправильно сгенеренной формы или же форма не генерилась напрочь.

p.s. вот так :/
не, ничего не помогает, на чем-то в итоге валится, даже если я переписываю все на news_instance в итоге ломается метод edit
ну news он и так не сможет просколнять, я пробовал добавлением :singular => 'news_instance'
и даже удачно заменил некоторые ссылки, но возникала проблема построения ссылки к списку новостей
Ну я выкинул все остальные роуты дефолтные, теперь выдает другую ошибку:

NoMethodError in News#new

Showing app/views/news/new.html.erb where line #3 raised:

undefined method `news_path' for #<ActionView::Base:0xf71c5870>

Extracted source (around line #3):

1: New news
2:
3: <% form_for(@news) do |f| %>
4: <%= f.error_messages %>
5:
6:
$ ruby --version
ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
$ gem --version
1.3.1
$ rails --version
Rails 2.2.2

$ rails -d mysql test

$ cd test/ && rake db:create
$ script/generate scaffold News title:string

warning Plural version of the model detected, using singularized version. Override with --force-plural.
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/news
exists app/views/layouts/
exists test/functional/
exists test/unit/
exists public/stylesheets/
create app/views/news/index.html.erb
create app/views/news/show.html.erb
create app/views/news/new.html.erb
create app/views/news/edit.html.erb
create app/views/layouts/news.html.erb
create public/stylesheets/scaffold.css
create app/controllers/news_controller.rb
create test/functional/news_controller_test.rb
create app/helpers/news_helper.rb
route map.resources :news
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/news.rb
create test/unit/news_test.rb
create test/fixtures/news.yml
create db/migrate
create db/migrate/20090124224453_create_news.rb

$ rake db:migrate
(in /home/amir/rails/test)
== CreateNews: migrating =====================================================
— create_table(:news)
-> 0.0068s
== CreateNews: migrated (0.0070s) ============================================

$ script/server
=> Booting Mongrel (use 'script/server webrick' to force WEBrick)
=> Rails 2.2.2 application starting on 0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
** Starting Mongrel listening at 0.0.0.0:3000
** Starting Rails with development environment…
** Rails loaded.
** Loading any Rails specific GemPlugins
** Signals ready. TERM => stop. USR2 => restart. INT => stop (no restart).
** Rails signals registered. HUP => reload (without restart). It might not work well.
** Mongrel 1.1.5 available at 0.0.0.0:3000
** Use CTRL-C to stop.

$ curl localhost:3000/news/new

В консоле где запущены рельсы, следюущее:

Processing NewsController#new (for спрятал ip-шник at 2009-01-24 22:46:24) [GET]
SQL (0.1ms) SET NAMES 'utf8'
SQL (0.0ms) SET SQL_AUTO_IS_NULL=0
News Columns (0.7ms) SHOW FIELDS FROM `news`
Rendering template within layouts/news
Rendering news/new

ActionView::TemplateError (news_url failed to generate from {:controller=>«news», :action=>«show»} — you may have ambiguous routes, or you may need to supply additional parameters for this route. content_url has the following required parameters: [«news», :id] — are they all satisfied?) on line #3 of app/views/news/new.html.erb:
1: New news
2:
3: <% form_for(@news) do |f| %>
4: <%= f.error_messages %>
5:
6: /usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/routing/route_set.rb:381:in `raise_named_route_error'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/routing/route_set.rb:341:in `generate'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/url_rewriter.rb:208:in `rewrite_path'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/url_rewriter.rb:187:in `rewrite_url'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/url_rewriter.rb:165:in `rewrite'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/base.rb:626:in `url_for'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/helpers/url_helper.rb:85:in `send'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/helpers/url_helper.rb:85:in `url_for'
(eval):16:in `news_path'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/polymorphic_routes.rb:112:in `__send__'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/polymorphic_routes.rb:112:in `polymorphic_url'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/polymorphic_routes.rb:119:in `polymorphic_path'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/helpers/form_helper.rb:269:in `apply_form_for_options!'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/helpers/form_helper.rb:248:in `form_for'
app/views/news/new.html.erb:3
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/renderable.rb:39:in `send'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/renderable.rb:39:in `render'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/template.rb:73:in `render_template'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/base.rb:256:in `render'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/base.rb:367:in `_render_with_layout'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/base.rb:254:in `render'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/base.rb:1174:in `render_for_file'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/base.rb:905:in `render_without_benchmark'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/benchmarking.rb:51:in `render'
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/core_ext/benchmark.rb:8:in `realtime'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/benchmarking.rb:51:in `render'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/mime_responds.rb:135:in `send'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/mime_responds.rb:135:in `custom'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/mime_responds.rb:160:in `call'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/mime_responds.rb:160:in `respond'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/mime_responds.rb:158:in `each'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/mime_responds.rb:158:in `respond'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/mime_responds.rb:107:in `respond_to'
app/controllers/news_controller.rb:29:in `new'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/base.rb:1253:in `send'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/base.rb:1253:in `perform_action_without_filters'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:617:in `call_filters'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:610:in `perform_action_without_benchmark'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
/usr/local/lib/ruby/1.8/benchmark.rb:293:in `measure'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/rescue.rb:136:in `perform_action_without_caching'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/caching/sql_cache.rb:13:in `perform_action'
/usr/local/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache'
/usr/local/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/query_cache.rb:8:in `cache'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/caching/sql_cache.rb:12:in `perform_action'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/base.rb:524:in `send'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/base.rb:524:in `process_without_filters'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/filters.rb:606:in `process_without_session_management_support'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/session_management.rb:134:in `process'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/base.rb:392:in `process'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/dispatcher.rb:183:in `handle_request'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/dispatcher.rb:110:in `dispatch_unlocked'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/dispatcher.rb:123:in `dispatch'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/dispatcher.rb:122:in `synchronize'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/dispatcher.rb:122:in `dispatch'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/dispatcher.rb:132:in `dispatch_cgi'
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/dispatcher.rb:39:in `dispatch'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:76:in `process'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `synchronize'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `process'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:159:in `process_client'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `each'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `process_client'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `initialize'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `new'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `initialize'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `new'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `run'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:282:in `run'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:in `each'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:in `run'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:128:in `run'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/command.rb:212:in `run'
/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:142:in `load_without_new_constant_marking'
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:142:in `load'
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:521:in `new_constants_in'
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:142:in `load'
/usr/local/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/commands/servers/mongrel.rb:64
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:153:in `require'
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:521:in `new_constants_in'
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:153:in `require'
/usr/local/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/commands/server.rb:49
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
script/server:3

К сожалению это не работает
habrahabr.ru/blogs/starting_programming/50085/#comment_1314727
Так же как и сделать табличку руками сделать модель и потом сгенерить скафолд, результат не айс
К сожалению и этот костыль сломался

NameError in News#index

Showing app/views/news/index.html.erb where line #24 raised:

undefined local variable or method `new_new_path' for #<ActionView::Base:0xf71abbb4>

Extracted source (around line #24):

21:
22:
23:
24: <%= link_to 'New new', new_new_path %>
Это костыль, а не решение проблемы.

p.s. Давайте теперь из-за невозможности называть вещи своими именами придумывать им другие :(
еще момент не пашет только def new
list
show
update
destroy

пашут вполне вменяемо
p.s. Может дело в том что нельзя делать имя модели New?
help me
p.s. мой мозг уже кипит)
я нуб в рельсах, поэтому найти баг приравнено к не понять, всей генеальности разработчиков :)
p.s. я видимо что-то не так делаю
p.s.s. если я один такой ненормальный решил сделать урл /news/ генерируя скаффолдами :)

Information

Rating
Does not participate
Location
Москва и Московская обл., Россия
Date of birth
Registered
Activity