Subscribed unsubscribe Subscribe Subscribe

F# Monkey

about

(F#) throttleを実装してみた!

今コツコツやってるdeoplete-fsharpで、throttleのところでつまづいてるのですが、まぁそれはさておき、面白い記事を見つけたので、やってみました!

matarilloさんというかたがthrottleを自前で実装してたので僕もまねしてF#で実装してみました!

まずはその前にmatarilloさんが作ったC#のコードをF#で使ってみます!

C#のコードをF#でつかう

dll化して取り込めばオーケー

こんな感じ

$ msc -t:library abc.cs

F#のコードは

#r @"./abc.dll"
open WhoToFollowApp
open System
open System.Threading

// 下記のテストコードとおなじ

F#に書き換えてみる

さて,C#のコードを使って感じを掴めたのでF#に書き換えてみます!

こんな感じ

open System
open System.Threading
open System.Threading.Tasks

type Throttle<'T> (millisec:int, action:Action<'T>) =
    
    let mutable signalSequence : int64 = 0L

    member this.Signal (input: 'T) : Async<unit> =
        async { 
            let   id      = Interlocked.Increment( &signalSequence )
            do!   Async.Sleep(millisec)
            let   current = Interlocked.Read( &signalSequence )
            if    current = id
            then  action.Invoke(input)
            else  () 
        }

テストコード

// 500ms値が発行されなかったら最後に発行された値を後続に流す
let throttle = new Throttle<int>(500, fun i -> 
    stdout.WriteLine("{0:HH:mm:ss.fff} {1}", DateTime.Now, i ) )

// 100ms間隔で値を発行
[|1..10|] 
|> Array.iter( fun i ->
    stdout.WriteLine("{0:HH:mm:ss.fff} Signal({1})",DateTime.Now, i)
    throttle.Signal(i) |> Async.Start
    Thread.Sleep(100) )

Thread.Sleep(2000)

stdout.WriteLine("---------------")

// 100ms間隔で値を発行
[|1..5|] 
|> Array.iter( fun i ->
    stdout.WriteLine("{0:HH:mm:ss.fff} Signal({1})",DateTime.Now, i)
    throttle.Signal(i) |> Async.Start
    Thread.Sleep(100) )

Thread.Sleep(2000)

stdout.WriteLine("---------------")

結果

21:27:04.172 Signal(1)
21:27:04.277 Signal(2)
21:27:04.383 Signal(3)
21:27:04.488 Signal(4)
21:27:04.593 Signal(5)
21:27:04.698 Signal(6)
21:27:04.799 Signal(7)
21:27:04.903 Signal(8)
21:27:05.006 Signal(9)
21:27:05.107 Signal(10)
21:27:05.612 10
---------------
21:27:07.218 Signal(1)
21:27:07.323 Signal(2)
21:27:07.429 Signal(3)
21:27:07.534 Signal(4)
21:27:07.639 Signal(5)
21:27:08.140 5
---------------

*** time : 7.727785 s ***

参考

qiita.com

Remove all ads