پایتون هیچ تضمینی در مورد رفتار این تابع، مخصوصاً در سیستمعاملهای مختلف نمیده. دلیل اصلیش اینه که بیشتر توابع این ماژول، در واقع نسخه همنام خودشون در کتابخانه C سیستمعامل رو صدا میزنن. دقتش هم واقعاً به دقت توقف (sleep) در سیستمعامل پایه بستگی داره و اگه میخوای بیشتر بدونی، بهتره مستندات سیستمعاملت رو بخونی، چون معنی این توابع در سیستمعاملهای مختلف فرق میکنه.
با این حال، یه خبر خوب هم داریم: از پایتون ۳.۵ به بعد، time.sleep(secs) حداقل به اندازه secs (همون آرگومانی که بهش دادی) متوقف میمونه، حتی اگه با یه سیگنال قطع بشه (همونطور که بالاتر گفتیم، سیگنال رو همون فروشنده در نظر بگیر)؛ مگر اینکه مدیریتکننده سیگنال، خطایی ایجاد کنه.
پس وقتی از time.sleep() استفاده میکنیم در پسزمینه چه اتفاقی میافته؟
این بخش فقط برای اینه که تابع رو بهتر درک کنی و برای شروع کار باهاش، نیازی نیست اینا رو بدونی. این تابع در واقع از ساعت سیستم (System Clock) استفاده میکنه؛ یه قطعه الکترونیکی در کامپیوتر که یه سیگنال پایدار و با فرکانس بالا میفرسته تا همه قطعات داخلی رو با هم هماهنگ کنه و بخشی از پردازندهست. این ماژول چیزی به اسم درخواستهای وقفه (IRQs) رو در فاصلههای زمانی قابل برنامهریزی ایجاد میکنه. وظیفه درخواستهای وقفه اینه که کدی که پردازنده داره اجرا میکنه رو متوقف کنن، وضعیت فعلی رو ذخیره کنن و بعدش کنترل رو به یه بخش دیگه از کد در سیستمعامل بسپارن.
پس کاری که تابع sleep() انجام میده اینه که روتین تکمیل I/O در سطح پایین یا فراخوانی ناهمگام (asynchronous) رو صدا میزنه تا پردازش رو مسدود (block) کنه. سیستمعامل میفهمه که تا رسیدن به زمان تعیینشده (timeout) نمیخوای هیچ کار دیگهای انجام بدی. وقتی این زمان تموم شد، سیستمعامل پردازش تو رو از آخرین وضعیتی که یادشه ادامه میده. و از دید تو، فقط یه فراخوانی ساده به تابع time.sleep() انجام شده.
تبریک میگیم که به تابع time.sleep() مسلط شدی! حتماً به دوره مقدمهای بر تابعها در پایتون در فینکا سر بزن تا چیزای بیشتری درباره توابع پایتون یاد بگیری.