https://github.com/heiwa4126/goflock-ex1
GoLangで複数プロセスでflockを使って排他制御を行うサンプルコード
https://github.com/heiwa4126/goflock-ex1
example flock golang
Last synced: 8 months ago
JSON representation
GoLangで複数プロセスでflockを使って排他制御を行うサンプルコード
- Host: GitHub
- URL: https://github.com/heiwa4126/goflock-ex1
- Owner: heiwa4126
- Created: 2021-08-19T01:34:55.000Z (almost 5 years ago)
- Default Branch: main
- Last Pushed: 2021-08-23T08:49:52.000Z (almost 5 years ago)
- Last Synced: 2025-08-28T05:34:31.102Z (10 months ago)
- Topics: example, flock, golang
- Language: Go
- Homepage:
- Size: 15.6 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# goflock-ex1
GoLangで複数プロセスでflockを使って排他制御を行うサンプルコード。
flock()を使っているのでUNIXのみ動く。詳しくは`man 2 flock`参照。
[heiwa4126/python_flock_ex1: Python 3で複数プロセスでflockを使って排他制御を行うサンプルコード](https://github.com/heiwa4126/python_flock_ex1)
がちょっとおもしろかったので、Go版を書いてみました。
# 動かし方
まずビルド
```sh
go build
```
Goなのでサブコマンド式になってます。
```sh
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](https://github.com/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\)](https://github.com/gofrs/flock)
を参照。
終わったら
```sh
rm /tmp/goflock-ex1-count*
```
すること。