GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing python.github.io — پشتیبانی پایتون از نخبندی آزاد پشتیبانی پایتون از نخبندی آزاد¶از نسخهی 3.13، CPython از ساختی از پایتون به نام نخبندی آزاد (free threading) پشتیبانی میکند که در آن قفل سراسری مفسر (global interpreter lock، GIL) غیرفعال است. اجرای نخبندی آزاد امکان بهرهبرداری کامل از توان پردازشی موجود را با اجرای موازی نخها بر روی هستههای CPU موجود فراهم میکند. اگرچه همهی نرمافزارها بهطور خودکار از آن بهرهمند نخواهند شد، برنامههایی که با در نظر گرفتن نخبندی طراحی شدهاند، روی سختافزار چندهستهای سریعتر اجرا خواهند شد. برخی بستههای شخص ثالث، بهویژه آنهایی که یک extension module دارند، ممکن است برای استفاده در یک ساخت نخآزادی (free-threaded build) آماده نباشند، و GIL را دوباره فعال خواهند کرد. این سند پیامدهای نخبندی آزاد برای کد پایتون را توضیح میدهد. برای اطلاع از نحوه نوشتن افزونههای C که از ساخت نخآزاد (free-threaded build) پشتیبانی میکنند، پشتیبانی افزونههای C API از نخبندی آزاد را ببینید. همچنین ببینید PEP 703 – اختیاری کردن قفل سراسری مفسر در CPython، برای توصیفی کلی از پایتون نخآزاد (free-threaded Python). نصب¶از پایتون 3.13 به بعد، نصبکنندههای رسمی macOS و Windows بهصورت اختیاری از نصب دودوییهای نخآزاد پایتون پشتیبانی میکنند. این نصبکنندهها در https://www.python.org/downloads/ در دسترس هستند. برای اطلاعات دربارهی سایر پلتفرمها، نصب پایتون نخآزاد را ببینید، یک راهنمای نصب نگهداریشده توسط کامیونیتی برای نصب پایتون نخآزاد. هنگام ساخت CPython از منبع، برای ساخت یک مفسر پایتون نخآزاد باید از گزینهی شناسایی پایتون نخآزاد¶برای بررسی اینکه آیا مفسر فعلی از نخآزاد پشتیبانی میکند، میتوان از متغیر پیکربندی قفل سراسری مفسر در پایتون نخآزاد¶ساختهای نخآزادی CPython از اجرای اختیاری با GIL فعال در رانتایم، با استفاده از متغیر محیطی ممکن است GIL همچنین بهصورت خودکار هنگام ایمپورت کردن یک ماژول توسعهی C-API که بهصراحت بهعنوان پشتیبانیکننده از نخبندی آزاد علامتگذاری نشده باشد، فعال شود. در این حالت هشداری چاپ خواهد شد. علاوه بر مستندات هر بسته، وبسایتهای زیر وضعیت پشتیبانی بستههای محبوب از نخبندی آزاد را پیگیری میکنند: ایمنی نخ¶ساخت نخآزاد CPython هدف دارد در سطح پایتون، رفتاری مشابه از نظر ایمنی در برابر نخها با ساخت پیشفرض دارای GIL ارائه کند. انواع توکار مانند نکته توصیه میشود در صورت امکان بهجای تکیه بر قفلهای داخلی انواع توکار، از محدودیتهای شناختهشده¶این بخش محدودیتهای شناختهشدهی ساخت CPython با نخهای آزادرا شرح میدهد. نامیراسازی¶در ساخت free-threaded، برخی اشیاء نامیرا هستند. اشیاء نامیرا آزاد نمیشوند و شمارش ارجاع آنها هرگز تغییر نمیکند. این کار برای اجتناب از رقابت بر سر شمارش ارجاع انجام میشود که مانع از مقیاسپذیری کارآمد چندنخی میشود. از زمان انتشار نسخهی 3.14، نامیرا شدن محدود است به:
اشیای فریم¶دسترسی به پیمایشگرها¶دسترسی همزمان به یک شیء پیمایشگر یکسان از طریق چندین نخ، عموماً ایمن در برابر نخ (thread-safe) نیست و نخها ممکن است عناصر تکراری یا ازدسترفته را مشاهده کنند. عملکرد تکنخی¶ساخت نخآزاد (free-threaded build) در مقایسه با ساخت پیشفرض با GIL فعال، هنگام اجرای کد پایتون سربار اضافی دارد. میزان سربار به بار کاری و سختافزار بستگی دارد. در بدنه بنچمارک pyperformance، میانگین سربار از حدود ۱٪ در macOS aarch64 تا ۸٪ در سیستمهای لینوکس x86-64 متغیر است. تغییرات رفتاری¶این بخش تغییرات رفتاری CPython را در ساخت نخآزاد (free-threaded build) توصیف میکند. متغیرهای زمینه¶در ساخت نخآزاد، پرچم فیلترهای هشدار¶در ساخت نخآزادی، پرچم افزایش مصرف حافظه¶ساخت با نخهای آزادبهطور معمول در مقایسه با ساخت پیشفرض از حافظهی بیشتری استفاده میکند. دلایل متعددی برای این موضوع وجود دارد که عمدتاً بهدلیل تصمیمهای طراحی است. همهی رشتههای درونیسازیشده نامیرا هستند¶در نسخههای مدرن پایتون (از نسخهی 2.3)، اینترن کردن (interning) یک رشته (برای نمونه با اشیای غیر GC سرآیند شیء بزرگتری دارند¶ساخت نخآزاد از ساختار QSBR میتواند آزادسازی حافظه را به تأخیر بیندازد¶برای پیادهسازی امن ساختارهای داده بدون قفل (lock-free)، از یک طرح بازیابی امن حافظه (SMR) استفاده میشود که با نام بازیابی مبتنی بر حالت سکون (QSBR) شناخته میشود. این بدان معناست که حافظه پشتیبان ساختارهای دادهای که دسترسی بدون قفل را ممکن میسازند، از QSBR استفاده میکند؛ این طرح عملیات آزادسازی را به تعویق میاندازد، نه اینکه حافظه را بلافاصله آزاد کند. دو نمونه از این ساختارهای داده، شیء فهرست و شیء کلیدهای دیکشنری هستند. برای جزئیات بیشتر درباره نحوه پیادهسازی QSBR، پرونده تخصیصدهندهی mimalloc در مقابل pymalloc¶ساخت پیشفرض معمولاً از تخصیصدهندهی حافظهی "pymalloc" برای تخصیصهای کوچک (۵۱۲ بایت یا کوچکتر) استفاده میکند. ساخت نخآزاد از pymalloc استفاده نمیکند و همهی اشیای پایتون را با استفاده از تخصیصدهندهی "mimalloc" تخصیص میدهد. تخصیصدهندهی pymalloc ویژگیهای زیر را دارد که به پایین نگهداشتن مصرف حافظه کمک میکنند: سربار کم به ازای هر بلوک تخصیصدادهشده، جلوگیری مؤثر از تکهتکه شدن حافظه، و بازگرداندن سریع حافظهی آزاد به سیستمعامل. تخصیصدهندهی mimalloc نیز در این زمینهها عملکرد بسیار خوبی دارد، اما ممکن است سربار بیشتری داشته باشد. در ساخت نخآزاد، mimalloc حافظه را در تعدادی هیپ جداگانه مدیریت میکند (در حال حاضر چهار). برای مثال، همه اشیایی که از GC پشتیبانی میکنند، از هیپ خودشان تخصیص داده میشوند. استفاده از هیپهای جداگانه به این معناست که حافظه آزاد در یک هیپ نمیتواند برای تخصیصی بهکار رود که از هیپ دیگری استفاده میکند. همچنین، برخی هیپها بهگونهای پیکربندی شدهاند که هنگام آزادسازی حافظهای که زیربنای هیپ است (و در اصطلاح mimalloc به آن «page» گفته میشود)، از QSBR (بازپسگیری مبتنی بر حالت سکون) استفاده کنند. استفاده از QSBR بین آزاد شدن همه بلوکهای حافظه یک صفحه و رهاسازی صفحه حافظه، چه برای تخصیصهای جدید و چه برای بازگشت به سیستمعامل، تأخیر ایجاد میکند. تخصیصدهندهی mimalloc همچنین بازگرداندن حافظهی آزادشده به سیستمعامل را به تعویق میاندازد. شما میتوانید این تأخیر را با تنظیم متغیر محیطی شمارش ارجاع نخآزاد میتواند باعث شود اشیاء بیشتر زنده بمانند¶در ساخت پیشفرض، وقتی شمار ارجاع یک شیء به صفر میرسد، آن شیء معمولاً آزاد میشود. ساخت نخآزادی از «شمارش ارجاع سوگیرانه» (biased reference counting) استفاده میکند که دارای یک مسیر سریع برای اشیاء «متعلق» به نخ جاری و یک مسیر کند برای اشیاء دیگر است. برای جزئیات بیشتر PEP 703 را ببینید. هر زمان که شمار ارجاع یک شیء در وضعیت «در صف» (queued) قرار گیرد، آزادسازی میتواند به تعویق بیفتد. وضعیت در صف از بخش «eval breaker» ارزیاب بایتکد پاک میشود. ساخت نخآزاد همچنین حالت متفاوتی از شمارش ارجاع را فراهم میکند که با نام «شمارش ارجاع معوق (deferred reference counting)» شناخته میشود. این حالت با تنظیم پرچمی بهازای هر شیء فعال میشود. شمارش ارجاع معوق برای انواع زیر فعال است:
هنگامی که شمارش ارجاع معوق (deferred reference counting) فعال باشد، ارجاعها از پشتههای تابع پایتون به شمار ارجاعها افزوده نمیشوند. این سازوکار سربار شمارش ارجاع را کاهش میدهد، بهویژه برای اشیایی که توسط چندین نخ استفاده میشوند. از آنجا که ارجاعهای پشته شمرده نمیشوند، اشیایی که شمارش ارجاع تعویقی دارند، هنگامی که شمار ارجاع داخلی آنها به صفر میرسد، بلافاصله آزاد نمیشوند. در عوض، آنها در اجرای بعدی زبالهروبی بررسی میشوند و اگر هیچ ارجاعی از پشته به آنها یافت نشود، آزاد میشوند. این یعنی این شیءها بهجای آزاد شدن مانند حالت معمول با صفر شدن شمار ارجاعشان، توسط زبالهروبی آزاد میشوند. شمارش ارجاع بهازای هر نخ میتواند آزادسازی اشیاء را به تأخیر بیندازد¶برای اجتناب از رقابت بر سر فیلدهای شمارش ارجاع اشیایی که بهطور مکرر به اشتراک گذاشته میشوند، ساخت نخآزاد نیز از «شمارش ارجاع بهازای هر نخ» برای چند نوع شیء انتخابشده استفاده میکند. بهجای بهروزرسانی یک شمارش ارجاع مشترک واحد، هر نخ آرایه شمارش ارجاع محلی خود را نگهداری میکند؛ این آرایه با شناسهای یکتا که به شیء اختصاص داده شده است، اندیسدهی میشود. شمارش ارجاع واقعی تنها زمانی با جمعکردن شمارشهای بهازای هر نخ محاسبه میشود که شمارش محلی شیء به ۰ برسد. شمارش ارجاع بهازای هر نخ در حال حاضر برای موارد زیر استفاده میشود:
از آنجا که شمارشهای ارجاع بهازای هر نخ باید پیش از امکان آزادسازی شیء، دوباره با آن ادغام شوند، اشیایی که از شمارش ارجاع بهازای هر نخ استفاده میکنند معمولاً دیرتر از زمانی آزاد میشوند که در ساخت پیشفرض آزاد میشدند. بهویژه، چنین شیءای معمولاً تا زمانی آزاد نمیشود که نخی که به آن ارجاع داده است به یک نقطه امن برسد (برای مثال، در بخش «eval breaker» ارزیاب بایتکد) یا خارج شود. اجرای
© حق نشر 2001 Python Software Foundation.
این صفحه تحت مجوز بنیاد نرمافزار پایتون نسخه ۲ منتشر شده است. مثالها، دستورالعملها، و سایر کدهای موجود در مستندات همچنین تحت مجوز بدون بند BSD منتشر شدهاند. برای اطلاعات بیشتر به تاریخچه و مجوز مراجعه کنید. بنیاد نرمافزار پایتون یک شرکت غیرانتفاعی است. لطفاً کمک مالی کنید. آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC). آیا اشکالی یافتید؟ ساخته شده با Sphinx 9.1.0. |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |