Skip to content

GoLangで複数プロセスでflockを使って排他制御を行うサンプルコード

Notifications You must be signed in to change notification settings

heiwa4126/goflock-ex1

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

goflock-ex1

GoLangで複数プロセスでflockを使って排他制御を行うサンプルコード。 flock()を使っているのでUNIXのみ動く。詳しくはman 2 flock参照。

heiwa4126/python_flock_ex1: Python 3で複数プロセスでflockを使って排他制御を行うサンプルコード がちょっとおもしろかったので、Go版を書いてみました。

動かし方

まずビルド

go build

Goなのでサブコマンド式になってます。

BIN=./goflock-ex1
INIT="$BIN init"      # カウンターを0に初期化
INC="$BIN inc"        # カウンターを10000増やす(排他制御なし)。並行で複数動かすと死ぬ。
FINC="$BIN flockinc"  # カウンターを10000増やす。並行で動かしても死なない。

# 期待通りに動いて、10000になる
$INIT ; $INC

# 死ぬ。または30000にならない
$INIT ; $INC & $INC & $INC

# 30000になる
$INIT ; $FINC & $FINC & $FINC

ex1,2 ...

  • ex1 - 素朴版。もとのPythonと同じ。ただしバッファリングなし。ファイルは数字文字列
  • ex2 - バッファリングなし。ファイルはUINT64をリトルエンディアンで
  • ex3 - 無理やりバッファI/Oにしてみた。ファイルはex2と同じ
  • ex4 - ex2を gofrs/flock にしてみたもの。ロックファイルがカウンタファイルと別

そのほかメモ

Pythonとちがって カウンターファイルをIOバッファリングしてないので、 ファイルそのものにロックがかけられる。

まあ効率を考えるとファイルの規模が大きくなるとバッファ使わないわけにいかないので Python同様、別ロックファイルにするべきだろう。 -> それはどうだろうか。

あと、Python版と等しくカウンターファイルを文字列にしてるんだけど 効率よくないのでUINT64そのもの書く版も学習用に作ってみる。 -> ex2として作ってみました。

Rust版も作ってみるかなあ。

UNIX以外もサポートする場合は gofrs/flock: Thread-safe file locking library in Go (originally github.com/theckman/go-flock) を参照。

終わったら

rm /tmp/goflock-ex1-count*

すること。

About

GoLangで複数プロセスでflockを使って排他制御を行うサンプルコード

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published