$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

「カラスの親指」読んだ

[asin:B009SM14DS:detail]

読んだ。

詐欺師を主人公にしたストーリー。ストーリーに引きこまれ、一気に読んでしまった。途中で入ってくるキャラクターで少しおっちょこちょいっぽい人がいたこともあって、少しハラハラしたのも良かった。最後に自分が思ってもいなかったように伏線が回収されていった。こういう伏線回収系の話は個人的に好きなので、非常に面白かった。

著者の道尾秀介 という人は他に何を書いているんだろうと思って調べたら、以前読んだ「向日葵の咲かない夏」を書いていた人だった。こちらも面白かったし、他にも面白そうなミステリー小説を色々書いているので、また他のものも読んでみたいと思う。

[asin:B0096PE4CU:detail]

「虐殺器官」を読んだ

映画化されるというのを見たので、興味が湧いて読んだ。非常に面白かった。

内容としては虐殺をテーマにしたSF小説みたいな感じ。タイトルに含まれているように虐殺に関する話題がいくつかストーリーの中に出てきて、そのあたりの歴史についてある程度興味がある人には面白い内容だと思う。また、攻殻機動隊とか電脳コイルとか、そういう雰囲気もあるので、このあたりのアニメが好きな人は楽しめると思う。

映画化されるということだけど、かなり残虐な内容も描かれているので、見ると辛くなりそうだなと思った。

TheSchwartzが次に実行するjobをどう見つけるか

TheSchwartzを利用していて、priority周りがどのように機能しているのかよく分からなかったので、軽くコードを読んでみた。

TheSchwartzでジョブを一つ実行する一番単純な手段はTheSchwartz->work_onceを一度実行する部分である。またジョブを実行するための他のいろいろな関数でも結局このwork_onceを利用している。そこでまずはwork_onceから読んでみる。

work_once

https://metacpan.org/source/JFEARN/TheSchwartz-1.12/lib/TheSchwartz.pm#L646

work_onceを見ると、すぐにjobを探していると思われるメソッドが見つかる。work_onceを引数なしで呼ぶことにより、find_job_for_workersが呼ばれ、jobが一つ返ってくるようだ。そこで続いてこのfind_job_for_workersを読んでみる。

find_job_for_workers

https://metacpan.org/source/JFEARN/TheSchwartz-1.12/lib/TheSchwartz.pm#L328

find_job_for_workersで重要そうな部分は

辺り。

https://metacpan.org/source/JFEARN/TheSchwartz-1.12/lib/TheSchwartz.pm#L327 にかかれているように、一度に取得してくるジョブ数は$client->batch_size分であり、これはデフォルトでは50に設定されている。

またhttps://metacpan.org/source/JFEARN/TheSchwartz-1.12/lib/TheSchwartz.pm#L329 にあるように、prioritizeというオプションが有効であれば、priority -> jobidの順でsortしてDBから取得してくるという事がわかる。prioritizeが有効でなければjobidの順でDBから取得してくる。なので、https://metacpan.org/pod/TheSchwartz に書かれているprioritizeというオプションが有効でないと、いくらjobにpriorityを指定しても意味が無いという事がわかる。

最後にhttps://metacpan.org/source/JFEARN/TheSchwartz-1.12/lib/TheSchwartz.pm#L380 から、$client->_grab_a_jobで、取得してきたjobから実行するjobを選んでいることが分かる。なので次は_grab_a_jobを読んでみる。

_grab_a_job

https://metacpan.org/source/JFEARN/TheSchwartz-1.12/lib/TheSchwartz.pm#L397

_grab_a_jobを見ると、まず最初に渡された引数をshuffleしている。つまり先ほど取ってきた50個ほどのジョブをshuffleしている。その後、順にjobを見ていって他のclientに取られていないjobを返すようにしている。基本的にはそれぞれのclientで別々にshuffleされているため、大体は一番最初のjobが実行されるように見える。

結論

  • prioritizeが有効であれば、priorityが高いものを優先してDBから取得してきてくれる
  • ただし、DBから取得してきたあとに、実行するjobを決めるときにはshuffleするため、priorityが高いものが常に先に実行されるわけではない
  • 極論を言うと、priorityが低いjobが1000個くらい入っていて、priorityが高いjobが3個という状況の時、1つジョブを選ぶ時にpriorityが高いものは3/50の確率でしか選ばれない
  • またDBから取得する際のデフォルトのlimitは50なので、ある程度ジョブがはけていて50個以下しかない場合は、priorityは意味が無い

などといったことが分かった。