Sobes.tech
Middle+

Тавзеҳ диҳед, ки чӣ гуна Event Loop дар контексти забони Dart ва рамки Flutter кор мекунад.

sobes.tech AI

Ҷавоб аз AI

Dart яго якнопотон аст, але для апрацоўкі асінхронных аперацый выкарыстоўвае Event Loop.

Event Loop складаецца з двух асноўных чаргаў:

  1. Microtask Queue: Для задач з высокім прыярытэтам і кароткіх асінхронных задач. Выконваюцца адразу пасля завяршэння бягучай аперацыі і перад пачаткам апрацоўкі наступнай ітэрацыі Event Loop.
  2. Event Queue: Для знешніх падзей (такіх як I/O, таймеры, карыстальніцкі ўвод). Задачы з гэтай чаргі апрацоўваюцца пасля таго, як Microtask Queue стане пустой.

Працэс працы:

  • Галоўны паток выконвае сінхронны код.
  • Пры сустрэчы з асінхроннай аперацыяй (напрыклад, Future, Stream, таймер), яна рэгіструецца і адпраўляецца ў адпаведную чаргу.
  • Event Loop пастаянна правярае Microtask Queue. Калі яна не пустая, задачы з яе выконваюцца да поўнага апусташэння.
  • Затым Event Loop правярае Event Queue. Калі яна не пустая, бярэ першае заданне і выконвае яго.
  • Гэты цыкл паўтараецца, пакуль абедзве чаргі не стануць пустымі і не будзе чакаць асінхронных аперацый.

Прыклад выкарыстання Future і scheduleMicrotask:

void main() {
  print('1. Пачатак main');

  // Дадае мікразадачу ў Microtask Queue
  scheduleMicrotask(() {
    print('3. Мікразадача выконваецца');
  });

  // Стварае асінхронную аперацыю, якая дадасца ў Event Queue пасля завяршэння
  Future(() {
    print('4. Future выконваецца (з Event Queue)');
  });

  // Дадае мікразадачу ў Microtask Queue
  scheduleMicrotask(() {
    print('5. Другая мікразадача выконваецца');
  });

  // Стварае Future з затрымкай, таксама адпраўляецца ў Event Queue
  Future.delayed(Duration(milliseconds: 10), () {
    print('6. Адложаны Future выконваецца (з Event Queue)');
  });

  print('2. Канец main');
}

// Чаканы парадак выканання:
// 1. Пачатак main
// 2. Канец main
// 3. Мікразадача выконваецца
// 5. Другая мікразадача выконваецца
// 4. Future выконваецца (з Event Queue)
// 6. Адложаны Future выконваецца (з Event Queue)

У Flutter Event Loop кіруе выкананнем задач UI (перамалёўка віджэтаў), апрацоўкай жэстаў, сеткавымі запытамі і іншымі асінхроннымі аперацыямі, забяспечваючы плаўную працу прыкладання без блакавання UI. Важныя задачы Flutter (напрыклад, планаванне кадра для рэндэрынгу) часта выкарыстоўваюць Microtask Queue для дасягнення больш высокага прыярытэту.