Skip to content

[BUG]: [native] kyo-scheduler regulator issues with blocking tasksΒ #1392

@hearnadam

Description

@hearnadam

Version

1.0-RC

Scala Version

3.7.1

Expected Behavior

import kyo.*

object BlockingIssue:
  val atomicInt = new AtomicInteger(0)

  val tick =
    Loop.forever {
      for
        stopwatch <- Clock.stopwatch
        _         <- Async.sleep(100.millis)
        elapsed   <- stopwatch.elapsed
        _         <- Sync.defer(println(s"${atomicInt.incrementAndGet()} - ${elapsed.toMillis}ms"))
      yield ()
    }

  def task(index: Int) =
    for
      stopwatch <- Clock.stopwatch
      _         <- Sync.defer(Thread.sleep(1000))
      elapsed   <- stopwatch.elapsed
      _         <- Sync.defer(println(s"Task $index completed in ${elapsed.toMillis}ms"))
    yield ()

  def runParallelTasks(n: Int) =
    Async.collectAllDiscard(List.tabulate(n)(task))

  val run =
    Async.zip(tick, runParallelTasks(100))

Should produce something similar to:

1 - 102ms
2 - 100ms
3 - 100ms
4 - 101ms
5 - 100ms
6 - 101ms
7 - 101ms
8 - 100ms
9 - 100ms
Task 90 completed in 1001ms
Task 10 completed in 1001ms
Task 60 completed in 1001ms
Task 25 completed in 1001ms
Task 40 completed in 1001ms
Task 0 completed in 1001ms
Task 85 completed in 1001ms
Task 50 completed in 1001ms
Task 45 completed in 1001ms
Task 15 completed in 1001ms
Task 70 completed in 1001ms
Task 95 completed in 1001ms
Task 20 completed in 1001ms
Task 30 completed in 1001ms
Task 80 completed in 1001ms
Task 35 completed in 1001ms
Task 65 completed in 1001ms
Task 55 completed in 1001ms
Task 75 completed in 1001ms
Task 5 completed in 1001ms
10 - 100ms
11 - 101ms
12 - 100ms
13 - 100ms
14 - 100ms
15 - 100ms
16 - 101ms
17 - 101ms
18 - 101ms
19 - 101ms
Task 86 completed in 1000ms
Task 76 completed in 1000ms
Task 81 completed in 1000ms

Actual Behavior

Ticks don't come at regular intervals

Task 50 completed in 1000ms
......
Task 15 completed in 1000ms
1 - 3001ms

Steps to Reproduce

scala-native πŸ™‚

Current Workaround

System.setProperty("kyo.scheduler.coreWorkers", "200")

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions