« Emacs Threads 20161225-2 | Main | Emacs Threads 20161231 »

December 29, 2016

Emacs Threads 20161229

2016年も本業でいろいろとEmacs Lispelisp)のプログラムを書いた。いずれも汎用的なものではないので公表はしないが、もしelispを書けなかったらどうするんだろうと考えると正直ゾッとする。

それを一番痛感するのはログ解析ではないだろうか。ログにはいろんなものが存在しテキスト形式のものに限っても、それを出力する機器、システムによって千差萬別なのだ。もちろん、EXCELで開いてソートしたり、フィルターしたりするだけでサマライズ出來るものは良いが、そうで無い場合は集計處理しない限り見れたものではない。そういうときに、ログを讀み込んで必要な情報を取り出し、それを集計するスクリプトを書くのにelispは大活躍する。さらに、マルチスレッドのサポートで大量のログもCPUパワーを最大限使用して、效率的に處理出來るようになりつつある。

以前から、なんでもかんでもマルチスレッドにすれば良いというものではないと書いてきた。深夜帶に動かして朝までに出來ていれば良いバッチ處理を、11秒速くするためにマルチスレッドにする必要はないというのが持論ではあるが、その場ですぐに結果を出す必要があるものに關しては速いに超したことはない。ということで、elispをマルチスレッドで動かすノウハウは嗜みとして掴んでおいた方が良いと考えている。私が贊成出來ないのは、別に順序立ててやれば良いだけの處理を、わざわざスレッドに分けて竝行實行し、それらのスレッドを思い通りに制御するのに苦心することだ。そんな不自然なことをしようとすれば、難しいに決まっている。

數日前に、マルチスレッドで自作のコマンドが動くことを確認出來たわけだが、これは「さあ動け!」とスレッドをバカバカ起動して野放しにするのではなく、決まった數だけ同時起動し、さらに合圖があるまで處理の開始を待たせ、すべてのスレッドが終わるのを確認する、という制御を行なっている。それでも個々のスレッドは意外に獰猛な動きをしようとする。論理CPU3個しかないのに1020もスレッドを起動しても動くはずがないのだ。

合圖があるまで處理を開始しないようにするには、ロックを掴んでスレッドを起動し、スレッドの先頭でロックを待てばよいだけだ。これは割と簡單でイメージ通りの動きをしてくれる。しかし、今のところはまだ狀態變數(Condition Variable)の使用方法が分からないままだ。これに關しては、まだ機能確認中である。

Ws000086


上のサンプルは、引數で指定した囘數だけロックを掴んでデバッグメッセージを出力するという簡單な處理を3個スレッド起動して動かしたものである。メインのスレッドでは、3個のスレッドを起動して、それらが生存している閒、それぞれのロックを順番に0.5秒ずつ解放しているだけ。子スレッド(親子關係はない)側でも0.5秒スリープしているので、たまに他の子スレッドよりも進行が遲れることがあり得、結果的に終了するタイミングがずれている。つまりループの先頭で0.5秒待って、ロックを取りに行ったらさらに0.5秒待たされたということになる。

こういうサンプルを通じて、徐々にelispのスレッド機能を把握出來ていくと思う。こういうのは、初めて魚を下ろすときの感覺に似ている。意味のある結果を出そうとするとなかなか手が出せないが、手を出さなければ絕對に出來るようにならないというヤツだ(笑)

|

« Emacs Threads 20161225-2 | Main | Emacs Threads 20161231 »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/74224/64690618

Listed below are links to weblogs that reference Emacs Threads 20161229:

« Emacs Threads 20161225-2 | Main | Emacs Threads 20161231 »