You can pass nonblocking: true
to enable a non-blocking dataloader implementation based on Ruby 3’s Fiber.scheduler
API:
class MySchema < GraphQL::Schema
use GraphQL::Dataloader, nonblocking: true # enable parallel data loading
end
Alternatively, you can add a non-blocking GraphQL::Dataloader
instance to context[:dataloader]
:
context = {
# ...
dataloader: GraphQL::Dataloader.new(nonblocking: true),
}
MySchema.execute(query_string, context: context, ...)
Additionally, you must set up a Fiber scheduler with Fiber.set_scheduler
before running your query:
Fiber.set_scheduler(MySchedulerImplementation.new)
MySchema.execute(...)
The scheduler must implement Fiber::SchedulerImplementation
. Existing implementations can be found at Fiber Scheduler List.
dsh0416/evt
supports several backends in Evt::Scheduler
.digital-fabric/libev_scheduler
contains Libev::Scheduler
, built on libev
, an event loop written in C. ⚠️ This works, but it was failing oddly on GitHub actions, so CI is turned off for it.socketry/async
contains Async::Scheduler
, but I haven’t figured out how to make it work with GraphQL::Dataloader
yet. Please update this doc if you know how to!