پاسخ تمرین ۱
متد put همانجا منتظر میماند تا جای کافی در صف باز شود، چون این متد یک awaitable است. اما put_nowait هیچوقت منتظر نمیماند؛ اگر صف پر باشد، بلافاصله خطای QueueFull را پرتاب میکند، نه اینکه صبر کند.
پاسخ تمرین ۲
هر آیتمی که با put داخل صف گذاشته شده، باید در نهایت با get برداشت شود، و برای هرکدام از آن آیتمها، مصرفکننده باید بعد از تمام شدن کارش متد task_done را صدا بزند. join فقط وقتی از منتظر ماندن دست میکشد که برای همهی آیتمهای put شده، یک task_done متناظر صدا زده شده باشد.
پاسخ تمرین ۳
هر مصرفکننده داخل یک حلقهی بیپایان منتظر آیتم بعدی میماند، پس خودش هیچوقت به نقطهی پایان طبیعی نمیرسد. وقتی کار همهی تولیدکنندهها تمام شد و صف کاملا پردازش شد، تنها راه متوقف کردن مصرفکنندهها این است که مستقیما لفوشان کنیم.
پاسخ تمرین ۴
متد empty میگوید آیا صف در همین الان هیچ آیتمی برای برداشت ندارد، و در این حالت درست برمیگرداند. متد full میگوید آیا صف از قبل به اندازهای که اجازه دارد پر شده، یعنی تا چیزی از آن خارج نشود، آیتم جدیدی نمیتوان اضافه کرد.