Асинхронні трейти

Асинхронні методи у трейтах було стабілізовано у випуску 1.75. Це вимагало підтримки використання impl Trait з позицією повернення у трейтах, оскільки десигнування для async fn включає -> impl Future<Output = ...>.

Однак, навіть з нативною підтримкою, існують деякі підводні камені навколо async fn:

  • Позиція повернення impl Trait фіксує всі терміни життя в межах області застосування (тому деякі моделі запозичення не можуть бути виражені).

  • Асинхронні трейти не можна використовувати з об’єктами трейтів (підтримка dyn Trait).

Крейт async_trait надає обхідний шлях за допомогою макросу, з деякими застереженнями:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Speaker Notes

This slide should take about 5 minutes.
  • async_trait простий у використанні, але зауважте, що для цього він використовує виділення в купі. Цей розподіл купи має накладні витрати на продуктивність.

  • Проблеми мовної підтримки async trait є надто глибокими, щоб детально описати їх у цьому уроці. Якщо ви зацікавлені у глибшому вивченні, перегляньте цей запис у блозі Ніко Мацакіса. Дивіться також ці ключові слова:

  • Спробуйте створити нову сплячу структуру, яка буде спати протягом випадкового періоду часу, і додайте її до Vec.