دسترسی هم‌زمان به iterator در Python؛ چرا thread-safe بودن مهم است؟

چرا مهم است

اگر تو یک generator را بین چند thread مشترک کنی، درخواست هم‌زمان مقدار بعدی می‌تواند به ValueError برسد. این مثال نشان می‌دهد چرا نباید thread-safe بودن iterator را بدون بررسی فرض کنی.

قبل از خواندن، این‌ها را بدان۳ مفهوم
iterator

شیئی که مقدارها را یکی‌یکی در اختیار مصرف‌کننده می‌گذارد؛ در Python می‌توان با next مقدار بعدی آن را درخواست کرد.

بیشتر درباره این مفهوم

generator

روشی برای تولید تدریجی مقدارها در Python با yield؛ اجرای آن میان تولید دو مقدار متوقف می‌شود و هنگام درخواست بعدی ادامه پیدا می‌کند.

بیشتر درباره این مفهوم

thread-safe

ویژگی یک ابزار یا شیء که اجازه می‌دهد چند thread در محدودهٔ تضمین‌های آن، بدون ایجاد خطای ناشی از دسترسی هم‌زمان از آن استفاده کنند.

بیشتر درباره این مفهوم

Rodrigo Girão Serrão در مقاله‌ای دربارهٔ iterator‌های thread-safe، مسئلهٔ استفادهٔ مشترک از یک iterator میان چند thread را بررسی می‌کند. او threading.serialize_iterator و threading.synchronized_iterator را به‌عنوان ابزارهای جدید Python 3.15 برای این کار نام می‌برد؛ بااین‌حال، بخش موجود از مقاله فقط مثال مسئله را نشان می‌دهد و به نحوهٔ استفاده از این ابزارها نمی‌رسد.

نکتهٔ اصلی این است که بیشتر iterator‌ها به‌صورت پیش‌فرض thread-safe نیستند. نویسنده برای نمایش این موضوع، یک generator به نام slow_counter تعریف می‌کند که پیش از تولید هر عدد، با time.sleep(1) یک ثانیه صبر می‌کند. سپس تابع count_consumer با next(counter) تلاش می‌کند مقدار بعدی را از همان generator بگیرد و در صورت بروز ValueError، خطا را نمایش می‌دهد.

این تابع در دو thread جدا اجرا می‌شود. هدف این است که thread دوم زمانی مقدار بعدی را درخواست کند که thread اول هنوز منتظر آماده‌شدن نتیجه است. طبق توضیح مقاله، این دسترسی هم‌زمان باعث ValueError در thread دوم می‌شود. بنابراین، اشتراک یک generator میان چند thread را نباید به‌خودی‌خود thread-safe فرض کرد؛ حتی اگر هر مصرف‌کننده فقط یک بار next را فراخوانی کند.

نکته کلیدی

وقتی تو از یک iterator مشترک در چند thread استفاده می‌کنی، اول وضعیت thread-safe بودنش را بررسی کن. برای یادگیری راه‌حل این مثال، باید نحوهٔ استفاده از دو ابزار نام‌برده را هم بخوانی؛ این بخش فقط مسئله را نشان می‌دهد.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۳)