[Python]Redisの並行処理で遊んでみる

入門Python3やってます。
並行処理でRedisを使っており、並行処理もRedisもちゃんと触ったことがなかったので、理解を深めるためにサンプルコードを改変してみました。

Redisとは

Redisはデータベースの一種です。よく一緒に語られる(ことが多い気がする)memcachedと違い、データを永続的に保存できる、文字列だけでなくキー/バリュー、リスト、セットなどのデータ構造が扱えるなどの特徴があります。

Redisのリストを使ってキューを作れることから、並行処理の用途で使っています。

やること

コンサートでありがちなコール・アンド・レスポンスをRedisで再現してみます。

送信側(Star)と受信側(Audience)に分かれ、StarがコールをするとAudienceはレスポンスを返してくれます。

おおまかな流れ

  • 送信側は、redisのインスタンスを生成し、rpushで値を送ります。
  • 受信側は、同じくredisのインスタンスを生成し、値が送られるのを待機、blpopで値を取得します。
  • Goodと言われたら受信側は待機を終了します。

コード

# redis_call.py : 送信側
import redis
import time
conn = redis.Redis()
print('Star:','Please say hoo when I say it!')
calls = ['Hoo, oh!', 'Hoo, hoo!', 'Hoo, hoo, hoo!']
for call in calls:
    msg = call.encode('utf-8')
    conn.rpush('calls', msg)
    print('Star: ', call)
    time.sleep(2)
conn.rpush('calls', 'good')
print('Star: ', 'Make some noise!')
# redis_response.py : 受信側
import redis
import time
conn = redis.Redis()
print('Audience is waiting')
while True:
    msg = conn.blpop('calls')
    if not msg:
        break
    val = msg[1].decode('utf-8')
    if val == 'good':
        break
    time.sleep(1)
    print('Audience: ', val)
time.sleep(0.5)
print('Audience: ', 'YEAHHHHHH!!!')

実行結果

redis_response.pyをバックグラウンドで実行した上で、redis_call.pyを実行します。
「&」を最後につけることでスクリプトをバックグラウンド実行できます。

$ python redis_response.py &
[2] 14748
Audience is waiting                                                             

$ python redis_call.py
Star: Please say hoo when I say it!
Star:  Hoo, oh!
Audience:  Hoo, oh!
Star:  Hoo, hoo!
Audience:  Hoo, hoo!
Star:  Hoo, hoo, hoo!
Audience:  Hoo, hoo, hoo!
Star:  Let's make some noise!
~/Developments/python-sandbox $ Audience:  YEAHHHHHH!!!

[2]  + done       python concurrency/redis_response.py

まとめ

並行処理は面白く、いろんなことができそうですが、具体的にどう使うかのイメージがまだ湧いていません。
色々と書き換えてみながら理解を深めつつ、どんな場面で使うのかといった事例を集めていきたいです。