Size: a a a

Clojure — русскоговорящее сообщество

2020 March 28

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
И ещё, нужно ли мне группировать записи или можно прям инсерт на каждого пользователя делать и база справится с этим?
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Tim Plotnikov
Всем привет!
Подскажите как сделать следующую штуку: мне нужно выбрать пользователей из базы, для каждого произвести кое-какие расчеты, сохранить результат в базу и отправить email?
Достаточно ли фора по массиву или нужно как-то использовать core.async или может вообще какой-нибудь job scheduler и каждого пользователя отправлять в этот шедулер?
core.async тебе тут врядли поможет, т.к. нормальных неблокирующих клиентов к бд нет. scheduler - может быть, смотря что за расчеты и сколько этих пользователей.
Вставлять по одной штуке скорее не ок, это зависит от кол-ва пользователей.
Просто на каждый запрос к бд тратится время на сетевое взаимодействие и чем больше запросов, тем менее эффективно происходит вставка.
Но если тебе нужно один раз вставить 1000 пользователей, можно по одному их вставлять. Ну или если нужно ночью это делать.
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
core.async тебе тут врядли поможет, т.к. нормальных неблокирующих клиентов к бд нет. scheduler - может быть, смотря что за расчеты и сколько этих пользователей.
Вставлять по одной штуке скорее не ок, это зависит от кол-ва пользователей.
Просто на каждый запрос к бд тратится время на сетевое взаимодействие и чем больше запросов, тем менее эффективно происходит вставка.
Но если тебе нужно один раз вставить 1000 пользователей, можно по одному их вставлять. Ну или если нужно ночью это делать.
Расчеты лайтовые, пользователей конечно не ожидаю много потому что пет-проект, но всегда есть Надежда на лучшее)
По поводу базы, нужно будет вставлять одну новую запись и апдейтить поле у пользователя
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Tim Plotnikov
Расчеты лайтовые, пользователей конечно не ожидаю много потому что пет-проект, но всегда есть Надежда на лучшее)
По поводу базы, нужно будет вставлять одну новую запись и апдейтить поле у пользователя
по идее это вообще 2мя запросами можно сделать, один update, один insert

https://www.postgresqltutorial.com/postgresql-update-join/
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
И это будет происходить возможно каждые пол часа
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
О, спс гляну
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Tim Plotnikov
Всем привет!
Подскажите как сделать следующую штуку: мне нужно выбрать пользователей из базы, для каждого произвести кое-какие расчеты, сохранить результат в базу и отправить email?
Достаточно ли фора по массиву или нужно как-то использовать core.async или может вообще какой-нибудь job scheduler и каждого пользователя отправлять в этот шедулер?
Можно просто pmap для начала. База справится, если это не фейсбук какой.
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Ivan Grishaev
Можно просто pmap для начала. База справится, если это не фейсбук какой.
Офигеть, то что нужно, спасибо
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
только pmap полуленивый, и его надо прогнать через doall
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Ivan Grishaev
только pmap полуленивый, и его надо прогнать через doall
Можно пример?
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
core.async тебе тут врядли поможет, т.к. нормальных неблокирующих клиентов к бд нет. scheduler - может быть, смотря что за расчеты и сколько этих пользователей.
Вставлять по одной штуке скорее не ок, это зависит от кол-ва пользователей.
Просто на каждый запрос к бд тратится время на сетевое взаимодействие и чем больше запросов, тем менее эффективно происходит вставка.
Но если тебе нужно один раз вставить 1000 пользователей, можно по одному их вставлять. Ну или если нужно ночью это делать.
Не знаю, почему core.async не поможет — там есть pipeline-blocking. В конце концов там есть thread, с помощью которого можно обеспечить себе нужный уровень параллелизма.
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Oleg Roshchupkin
Не знаю, почему core.async не поможет — там есть pipeline-blocking. В конце концов там есть thread, с помощью которого можно обеспечить себе нужный уровень параллелизма.
Core.async это про неблокирующий ввод/вывод. А треды и без него работают.
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
Core.async это про неблокирующий ввод/вывод. А треды и без него работают.
Я не знаю, про что core.async, но такие возможности там есть, поэтому можно ими пользоваться.
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Треды работают, future работают, много чего работает.
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
Core.async это про неблокирующий ввод/вывод. А треды и без него работают.
Хм, я не уверен что core.async ограничивается nio. Я думаю это про асинк в общем
источник

TP

Tim Plotnikov in Clojure — русскоговорящее сообщество
Каналы они и в Африке каналы
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Tim Plotnikov
Можно пример?
(doall (pmap process-user users-from-db))
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
Core.async это про неблокирующий ввод/вывод. А треды и без него работают.
собственно core.async сам по себе вообще не содержит ничего с io. и прекрасно работает и имеет смысл в коде полном блокирующих вызовов
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Andrew Rudenko
собственно core.async сам по себе вообще не содержит ничего с io. и прекрасно работает и имеет смысл в коде полном блокирующих вызовов
Исходный вопрос был про то, как сохранять что-то в бд.
core.async там не нужен.
Если бы был ассинхронный jdbc или что-то похожее, да, core.async позволит уйти от колбеков.
Да, в core.async нет ничего про неблокирующий io.
> имеет смысл в коде полном блокирующих вызовов
а ничего, что там тред пул по числу процессоров и все эти треды заблокируются на блокирующих вызовах? или ты не об этом?
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
Исходный вопрос был про то, как сохранять что-то в бд.
core.async там не нужен.
Если бы был ассинхронный jdbc или что-то похожее, да, core.async позволит уйти от колбеков.
Да, в core.async нет ничего про неблокирующий io.
> имеет смысл в коде полном блокирующих вызовов
а ничего, что там тред пул по числу процессоров и все эти треды заблокируются на блокирующих вызовах? или ты не об этом?
> а ничего, что там тред пул по числу процессоров и все эти треды заблокируются на блокирующих вызовах?

ну во-первых, это не так. там два тред пула, один для go-блоков, другой для thread
источник