今さらPython3 (74) - Redisを使った並行処理

第11章は内容が濃いので進み方もゆっくり。

入門 Python 3

入門 Python 3

Redis

前回、Redisに触ったのは第8章だったんだね。随分前の事のように感じる。ということで、インストール済。

ソースコードを用意して、

Redisを起動してから、

$ redis-server /usr/local/etc/redis.conf
12703:M 28 Dec 08:47:10.014 * Increased maximum number of open files to 10032 (it was originally set to 256).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.0.1 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 12703
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

12703:M 28 Dec 08:47:10.021 # Server started, Redis version 3.0.1
12703:M 28 Dec 08:47:10.022 * DB loaded from disk: 0.002 seconds
12703:M 28 Dec 08:47:10.022 * The server is now ready to accept connections on port 6379

乾燥係からスタート。後ろに&を付けるとバックグランド実行になる。なぜかコマンドプロンプトの後ろにDryer is startingが表示されて何も入力できないように見えるが、構わず洗い係を起動させると、こんな感じの結果が得られる。

$ python3 redis_dryer.py &
[1] 12719
$ Dryer is starting
python3 redis_washer.py
Washer is starting
Washed salad
Washed bread
Dried salad
Washed entree
Dried bread
Washed dessert
Dried entree
Washer is done
Dried dessert
Dishes are dried
[1]+  Done                    python3 redis_dryer.py

これは、まあこんなんだろなという感じで特に目新しいところはないので次へ。redis_dryer2.pyを作る。

こんな感じで実行。

$ python3 redis_dryer2.py &
[1] 12831
$ Dryer process 12832 is starting
Dryer process 12833 is starting
Dryer process 12834 is starting
python3 redis_washer.py
Washer is starting
Washed salad
12832: drided salad
Washed bread
12833: drided bread
Washed entree
12834: drided entree
Washed dessert
Washer is done
$ Dryer proces 12833 id done
12834: drided dessert
Dryer proces 12832 id done
Dryer proces 12834 id done

[1]+  Done                    python3 redis_dryer2.py

ペタッと結果だけ貼ってしまうとイメージしにくいけど、quitを受け取った12833が最初にdoneとなり、その後約20秒待ってから12832,12834はタイムアウトを起こしてdoneになったと。ちなみに最後の1行はポケーッと待っていても表示されない。1回Enterを叩く必要がある。ちなみに、乾燥係を起動してから20秒何もしないでポケーッとしていると、全プロセスがタイムアウトで終了する。これも当たり前だよね。

個人でプログラムを書いているようなときは、スタンドアロンで済んでしまうことも多々あるけど、業務系とかのシステムだとキューで飛ばして整合性がどうのこうのという話はよくあるので、そこら辺の設計をイチから考えるより、ありもののパッケージを選択肢にしてもいいんだよね。

Homepage | Celery: Distributed Task Queue
andyet/thoonk.py · GitHub
RQ: Simple job queues for Python

(つづく)