Select

یک عملیات انتخابی منتظر می‌ماند تا هر یک از مجموعه‌ای از futureها آماده شود و به نتیجه آن future پاسخ می‌دهد. در JavaScript این مورد شبیه به Promise.race است و در پایتون با asyncio.wait(task_set, return_when=asyncio.FIRST_COMPLETED) قابل مقایسه می‌باشد.

مانند یک عبارت تطبیقی (match statement)، بدنه pattern دارای تعدادی بازو است که هر کدام به شکل عبارت pattern = future => statement هستند. هنگامی که future آماده است، مقدار بازگشتی آن توسط pattern تخریب می‌شود. سپس statement با متغیرهای حاصل اجرا می‌شود. در نتیجه statement نتیجه‌ي ماکرو select! می‌شود.

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Speaker Notes

This slide should take about 5 minutes.
  • بلوک async listener در اینجا یک شکل رایج است: منتظر برخی رویدادهای async یا به‌عنوان مثال برای timeoutها باشید. sleep را به sleep طولانی‌تر تغییر دهید تا شاهد شکست آن باشید. چرا send نیز در این شرایط شکست می‌خورد؟

  • select! is also often used in a loop in “actor” architectures, where a task reacts to events in a loop. That has some pitfalls, which will be discussed in the next segment.