遅いと思ったらとりあえずspawn
以前にも書いたように、Rails Tutorialをphoenixでやってたやつをまたちょいちょい書いている。
その中で、seedでダミーのユーザを100人つくるというのがあった。かなり前にseedつくる用のパッケージ書いたなと思い出してメンテしてねぇやべぇとおもったけど、素直にchangeset
からのinsert!
でやることにした。
## priv/repo/seeds.exs alias PhMicroblog.{User, Repo} defmodule Helper do def insert_user!(name, email, password) do params = %{ name: name, email: email, password: password, password_confirmation: password } %User{} |> User.changeset(params) |> Repo.insert! end end Faker.start Helper.insert_user!("Example User", "example@railstutorial.org", "foobar") Enum.each 1..99, fn i -> Helper.insert_user!(Faker.Name.name, "example-#{i}@railstutorial.org", "password") end
mix ecto.setup
すればマイグレーションとかした後これが走る。やってみたらこれがまた遅い。すげー遅い。
こんな遅かったっけ?と思いながらおもむろにspawn
Enum.each 1..99, fn i -> spawn fn -> Helper.insert_user!(Faker.Name.name, "example-#{i}@railstutorial.org", "password") end end
結構速くなった。3倍くらい。
# before $ time mix ecto.setup mix ecto.setup 37.82s user 0.85s system 98% cpu 39.451 total # after $ time mix ecto.setup mix ecto.setup 38.84s user 0.74s system 302% cpu 13.105 total
カジュアルに並行にできるのよいすな。
ただこれやると、"example-#{i}@railstutorial.org"
のi
とauto incrementのidがバラバラになるんで、そこは注意。