それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

PythonでPOSIXのMessageQueue を使う。

POSIX の メッセージ・キューを使う。

プロセス間通信などと呼ばれる。POSIXのキューを使ってみる。

プロセス間通信 - Wikipedia

プロセスとプロセスのデータのやり取りにメッセージ・キューを使うことで幾分楽になる。マルチスレッド以前に複数プロセスでデータをやり取りすると複数分散して処理が楽になることもある。

動作例

youtu.be

ポイント

  • 送信側はドンドン送信できる。
  • 受信側は逐次読み込んで取り出せる。
  • データが空っぽなら、受信側はブロックされる。

受信側は、なにもしなくても受信不可ならブロックされるので楽ちん。感覚的には、空っぽのパイプと同じですね。

インストール

python で使うには posix_ipcを使う

pip install posix_ipc

Queueにメッセージを追加

#!/usr/bin/env python

import json
import posix_ipc

def main () :
  mq = posix_ipc.MessageQueue("/my_q01", posix_ipc.O_CREAT )
   #
  cnt = 0
  #
  while True:
    cnt = cnt + 1
    obj = { "counter": cnt }
    mq.send( json.dumps( obj ) )
    print("pushed: %d" % cnt )
    time.sleep(1)


if __name__ == "__main__" :
  main()

Queue からメッセージを取り出す

#!/usr/bin/env python

import json
import posix_ipc

def main () :
  mq = posix_ipc.MessageQueue("/my_q01", posix_ipc.O_CREAT )
  # 
  while True:
    data = mq.receive()
    print( data[0] )
    time.sleep(1)

if __name__ == "__main__" :
  main()

Queue を削除する

#!/usr/bin/env python
import posix_ipc

mq = posix_ipc.MessageQueue("/my_q01")
mq.unlink()

コマンドからも確認できます。

takuya-1st.hatenablog.jp

参考資料

Semanchuk.com - POSIX IPC for Python - Semaphores, Shared Memory and Message Queues