Skip to content

Commit

Permalink
Merge pull request #848 from devlights/add-cancelreader-example
Browse files Browse the repository at this point in the history
  • Loading branch information
devlights authored Sep 16, 2024
2 parents 4196fc3 + 7a88cd5 commit 134a8b5
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 0 deletions.
8 changes: 8 additions & 0 deletions examples/singleapp/cancel_reader/Taskfile.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# https://taskfile.dev

version: '3'

tasks:
default:
cmds:
- echo -n helloworld | go run main.go
81 changes: 81 additions & 0 deletions examples/singleapp/cancel_reader/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package main

import (
"errors"
"fmt"
"log"
"os"
"time"

"github.com/muesli/cancelreader"
)

func main() {
log.SetFlags(log.Lmicroseconds)
log.SetOutput(os.Stdout)

if err := run(); err != nil {
log.Panic(err)
}
}

func run() error {
//
// 標準入力をキャンセル可能なReaderにする
//
// cancelreader.CancelReaderは、Linuxの場合
// 内部で epoll を利用して制御を行っている。
//
// なので、非ブロッキングI/Oが可能なファイルディスクリプタに対してのみ
// キャンセル可能となっている。非ブロッキングI/Oが可能なものは例えば以下のもの。
// - ソケット
// - パイプ
// - FIFO
//
// 通常のファイルは非ブロッキングI/O可能なファイルディスクリプタでは無いことに注意。
// 通常のファイルをepollで利用すると epoll_ctl() で EPERM が返ってくる。
// 通常のファイルをキャンセル可能にしたい場合は io_uring などを検討する。
//

var (
reader cancelreader.CancelReader
err error
)
reader, err = cancelreader.NewReader(os.Stdin)
if err != nil {
return fmt.Errorf("cancelreader.NewReader() failed: %w", err)
}
defer reader.Close()

//
// 3秒後にキャンセル
//
go func() {
time.Sleep(3 * time.Second)
reader.Cancel()
}()

//
// 500ms毎に1文字読み込み
//
var (
buf [1]byte
)
for {
clear(buf[:])

if _, err = reader.Read(buf[:]); err != nil {
if errors.Is(err, cancelreader.ErrCanceled) {
log.Println("CANCELED")
break
}

return fmt.Errorf("reader.Read() failed: %w", err)
}

log.Print(string(buf[:]))
time.Sleep(500 * time.Millisecond)
}

return nil
}
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,5 @@ require (
gopkg.in/natefinch/lumberjack.v2 v2.2.1
gopkg.in/yaml.v3 v3.0.1
)

require github.com/muesli/cancelreader v0.2.2
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/integrii/flaggy v1.5.2 h1:bWV20MQEngo4hWhno3i5Z9ISPxLPKj9NOGNwTWb/8IQ=
github.com/integrii/flaggy v1.5.2/go.mod h1:dO13u7SYuhk910nayCJ+s1DeAAGC1THCMj1uSFmwtQ8=
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
Expand Down

0 comments on commit 134a8b5

Please sign in to comment.