@rubylang

Страница 1385 из 1684
Максим
15.02.2018
11:50:20
поменять связь получилось таким вот способом def model_params params.require(:building).except(:type, :flat_types, :image_types, :building_assignment_types).permit! end

добавив ексцепт

Zamira
15.02.2018
14:02:02
Есть кто нибудь, кто работает в мультипоточном режиме puma?

Sergei
15.02.2018
14:03:13
есть

Google
Zamira
15.02.2018
14:03:46
есть
Есть контроллер. Там инициализирую переменную потока, например, Thread.current[:my_var]. В контроллере есть сохранение объекта эктиврекорд в базу. Вот, а в модели в колбэке получаю доступ к переменной Thread.current[:my_var]. Как себя поведет такой код с мультипоточными серверами приложений puma, thin?

Sergei
15.02.2018
14:06:28
если это в рамках одного Request'a, то должно быть нормально

если между request'ами, то соотвественно будут другие данные, и нужно пользоваться внешними хранилищами

Zamira
15.02.2018
14:07:32
если между request'ами, то соотвественно будут другие данные, и нужно пользоваться внешними хранилищами
Я так понимаю у puma мультипоточность предполагает обработку одного запроса многими потоками. Поэтому ищу информацию.

Alexander
15.02.2018
14:08:17
нет, один запрос - один поток (если не создавать дочерних потоков внутри)

Zamira
15.02.2018
14:09:54
нет, один запрос - один поток (если не создавать дочерних потоков внутри)
Вот уже интереснее. Я такую информацию не нашла. Где нибудь в спецификации это написано? ?

ojab
15.02.2018
14:10:30
>Puma then serves the request in a thread from an internal thread pool. Since each request is served in a separate thread, truly concurrent Ruby implementations (JRuby, Rubinius) will use all available CPU cores.

Alexander
15.02.2018
14:11:20
нет документации я не искал, но это просто не то что невозможно а очень сложно (один запрос несколькими потоками) - это нужно branch predict и другие штуки которые умеет только CPU

Zamira
15.02.2018
14:12:01
А чем тогда многопоточные сервера приложений по факту отличаются от однопоточных?

Alexander
15.02.2018
14:12:31
в случае с mri руби с потоков немного толку, ну а так то выше: > truly concurrent Ruby implementations (JRuby, Rubinius) will use all available CPU cores.

Sergei
15.02.2018
14:12:39
Ну чуть производительнее, за счет, того, что GIL не блокируют разные внешние запросы

например сетевые вызовы

а так, в целом, реальная конкуррентность будет зависеть от количества ядер CPU и запущенных puma processes, соответственно

Google
Alexander
15.02.2018
14:13:16
любое IO по идее: база, чтение файлов, > сетевые вызовы

Zamira
15.02.2018
14:13:49
То есть физически в пределах запроса поток один и без проблем можно работать с переменными потока?

Sergei
15.02.2018
14:14:18
это сишный стандартный руби

Zamira
15.02.2018
14:14:52
это сишный стандартный руби
И в нем потоки не физические, а логические?

и общие переменные потока?

Sergei
15.02.2018
14:15:06
руби не поддерживает потоки на уровне ОС

можно добиться многопоточности на уровне ВМ например в jruby

ojab
15.02.2018
14:16:04
Sergei
15.02.2018
14:16:04
формально - потоки логические и блокируемые, как сказали выше на все кроме IO

Ну явно не создает поток на уровне ОС)

Alexander
15.02.2018
14:16:43
если хочется настоящей паралельности на уровне OC, надо или создавать не потоки а процесы ("долго" и затратно по оперативе) либо работать с jruby (тоже так себе опыт)

Антон
15.02.2018
14:17:30
либо не использовать руби

ojab
15.02.2018
14:17:58
Thread.new создаёт поток на уровне ОС

Alexander
15.02.2018
14:18:30
глобальные переменные это зло, если чтото надо и в контроллере и в сервисе и в модели - значит бизнес логика размазана по самое небалуй

Zamira
15.02.2018
14:19:41
Суть не в желании. Просто встал вопрос при ревью. Мне отказывают в использовании переменных потока объясняя тем, что puma, thin потоконебезопасные, да еще и многопоточные. А в многопоточных якобы я не смогу в модели получить доступ к переменной, что установила в контроллере (в пределах одного запроса). Никакой бизнес логики. Просто хочу сохранять id пользователя, который сохраняет что-то в базу.

ojab
15.02.2018
14:20:13
врут

потоконебезопасные — это вообще непонятный термин применительно к app server'у

Google
Zamira
15.02.2018
14:21:45
ну я сталкивалась с тем, что одни потоки имеют доступ к данным других потоком. например параметры get запросов или данные сессий смешиваются.

были баги такие...

ojab
15.02.2018
14:22:14
это не другой поток, это данные с прошлого запроса, которые не очистили

в том же потоке, да

ojab
15.02.2018
14:23:28
это не другой поток, это данные с прошлого запроса, которые не очистили
(или какая-то библиотека/гем выставили переменную во всех потоках, но это потоконебезопасные библиотеки, а не app server)

Vasiliy
15.02.2018
14:23:30
если рельса обновляется попробуй CurrentAttributes(но они тоже работают с переменной треда)

Евгений
15.02.2018
14:24:08
https://github.com/steveklabnik/request_store ~?

Vasiliy
15.02.2018
14:24:15
http://edgeapi.rubyonrails.org/classes/ActiveSupport/CurrentAttributes.html

Zamira
15.02.2018
14:24:25
люди имели параметры get запроса, которых у них быть не могло. ладно, это лирика. так что же мультипоточность пумы означает в итоге? оков будем иметь только если сами инициируем создание новых потоков:

http://edgeapi.rubyonrails.org/classes/ActiveSupport/CurrentAttributes.html
Спасибо большое. Эта штука с каких рельсов доступна?

ojab
15.02.2018
14:26:00
https://github.com/steveklabnik/request_store ~?
в модели request недоступен

Vasiliy
15.02.2018
14:27:24
оу, вроде погорячился и в 5.2 будет

но я так понял оно на основе Thread.current работает

Alexander
15.02.2018
14:29:15
если проблема это записать в базу id юзера - то почему вообще идет речь о Thread?

ojab
15.02.2018
14:29:51
Передать current_user в модель же

как его лучше передавать?

Zamira
15.02.2018
14:30:20
я хочу его в колбэке модели иметь

Vasiliy
15.02.2018
14:30:27
ну кстати а почему не передать явно?

Google
Alexander
15.02.2018
14:30:32
Post.new(user_id: current_user.id) не?

я хочу его в колбэке модели иметь
в модели нету поля user_id ?

зачем вообще модели чтото знать о юзере, это не ее зона ответственности

ojab
15.02.2018
14:31:59
after_save -> { LogRecord.create!(change: …, user: user) }

Vasiliy
15.02.2018
14:32:10
ну или лучше отказаться от коллбека в польсу сервиса

Alexander
15.02.2018
14:32:20
ойой

Zamira
15.02.2018
14:32:49
Не совсем. На создаваемый объект ведется журналирование действий над ним в другой сущности. Журналирование выполняется в колбэке. В модели поля user_id нет. У меня бывают не только пользователи, но и сотрудники(это другая сущность в системе), которые могут менять эти данные

Alexander
15.02.2018
14:33:00
я вначале своего пути использовал колбеки, теперь вижу что это зло

Zamira
15.02.2018
14:33:52
Я в проекте, где все это уже есть. В модели есть несколько полей, которые хранят сотрудников разных ролей, которые над ними работали. Условно admin_id, manager_id. Все таки было. Мне просто нужно дописать журнал изменений.

Alexander
15.02.2018
14:33:54
def self.create_post(user_id, change:, etc:) Post.create(....) LogRecord.create(...) end

Vasiliy
15.02.2018
14:33:56
ну или как вариант спроси у чуваков кто тебе про потокобезопасность сказал что делать

Zamira
15.02.2018
14:34:02
Вариант отрефакторить с нуля все не пойдет)

Vasiliy
15.02.2018
14:34:27
не рефакторить, а дополнительно вызывать метод записи в лог

я по началу кстати из пхп всё охуевал что в модели нет доступа к юзеру в модели

Zamira
15.02.2018
14:35:19
не рефакторить, а дополнительно вызывать метод записи в лог
таких точек слишком много. десятки. может и больше ста. не вариант вставлять сохрание лог записи после каждого места где что-то сохдается или меняется

Vasiliy
15.02.2018
14:35:35
тоже задачи на логирование действий были

Zamira
15.02.2018
14:36:10
так что либо колбэки либо сервисы. а как на сервисах такое реализовать?

Vasiliy
15.02.2018
14:36:59
ну сервис надо везде будет вставлять где запись идёт

Zamira
15.02.2018
14:37:22
сервис = concern?

Google
Zamira
15.02.2018
14:37:26
или как?

Alexander
15.02.2018
14:37:29
таких точек слишком много. десятки. может и больше ста. не вариант вставлять сохрание лог записи после каждого места где что-то сохдается или меняется
я понимаю что теперь писать о том что это спроектировано через задницу уже поздно но все же. переписать чтобы везде для сохранения использовалься один и тот же метод, чтото типа Record.create_with_log а внутри уже делать как выше

Антон
15.02.2018
14:38:01
таких точек слишком много. десятки. может и больше ста. не вариант вставлять сохрание лог записи после каждого места где что-то сохдается или меняется
тогда писать в объект который сохраняется, чтобы знать кто этот объект сохраняет, но это тоже не его отвественность

Alexander
15.02.2018
14:38:03
или сервис, по сути такой же метод но определен не в модели а в другом классе

есть еще очень простой вариант с attr_accessor который поможет вашему коллбеку найти своего юзера, но я его не напишу ибо это говнокод

Vasiliy
15.02.2018
14:40:33
можешь кстати попробовать с событиями что-нибудь приудмать

Alexander
15.02.2018
14:41:32
ну вообще нормальная ситуация лол) была СРМ, не было сотрудников, ввели сотрудников, возникла необходимость логировать всё
ладно, может быть. просто надо чтобы одинаковые действия делались через одно и тоже место

Vasiliy
15.02.2018
14:43:31
ну у тебя есть заказ, ты такой пишешь сохранение заказа через update там или save(как обычно) и вот тебе стало нужно писать автора изменения - измененяешь через одно место

Aleksey
15.02.2018
14:43:51
народ, напомните пожалуйста, кидали тут ссылку на сайт где предлагаются задачки для желающих попилить OSS

Vasiliy
15.02.2018
14:44:26
http://www.ossboard.org/

Sergei
15.02.2018
14:44:37
cultofmartians.com

Aleksey
15.02.2018
14:44:50
данкешон!

Sergei
15.02.2018
14:45:01
Если вопрос стоит в логировании данных, то можно использовать http://guides.rubyonrails.org/active_support_instrumentation.html#creating-custom-events

Vasiliy
15.02.2018
14:46:25
Если вопрос стоит в логировании данных, то можно использовать http://guides.rubyonrails.org/active_support_instrumentation.html#creating-custom-events
вот да, тоже хотел это скинуть, там при чем даже стандартные ивенты есть для записи в БД, но оно тоже не потокобезопасно

ojab
15.02.2018
14:46:41
Sergei
15.02.2018
14:46:59
логировани в базу?

ojab
15.02.2018
14:47:15
прозреваю что оно в базу логирует, да

Alexander
15.02.2018
14:47:31
это типа запись активити а не обычный лог

Vasiliy
15.02.2018
14:48:00
ну кстати да, ожаб прав, оно может автора изменения залогировать, а само изменение откатить

Страница 1385 из 1684