laravel / ideas

Issues board used for Laravel internals discussions.
938 stars 28 forks source link

non-Blocking Model Fetching #2467

Closed amrikasir closed 3 years ago

amrikasir commented 3 years ago

I need non-blocking model execution

$modelA;
$modelB;
$modelC;
$modelD;

AsyncClass::add(function() use(&$modelA) {
    // Model A need 10s to be done
    sleep('10');
    return $modelA = SomeModelClass::get();
})->then(function($modelA) use(&$modelB) {
    // Model B need 20s to be done after Model A
    // because Model B need data from Model A
    // need 30s in total
    sleep('20');
    $modelB = ModelBClass::whereIn('column', $modelA->pluck('id')->get();
}, function($modelA) use(&$modelD){
    // Model D will run synchronously with Model B
    // and using data from Model A too
    // it will cost 5s to be done
    sleep('5');
    $modelD = ModelDClass::whereIn('columnX', $modelA->pluck('other_id')->get();
});
AsyncClass::add(function() use(&$modelC) {
    // Model C just need 5s
    // Model C will done first since Model B dont need data from Model A or Model B
    sleep('5');
    $modelC = SomeModelClassC::where('column', 'xxx')->orderBy('column')->first();
})

// will take the 30s in total
// because Model A need 10s, and model B need 20s
// model C and D just need 5s, they will be done before model B done
AsyncClass::run();

return [
    'modelA' => $modelA,
    'modelB' => $modelB,
    'modelC' => $modelC,
    'modelD' => $modelD
];
themsaid commented 3 years ago

You'll need to use Laravel Octane.