اعمال هم زمان در پایتون ( بخش دوم )

4 02 2008
اعمال هم زمان در پایتون ( بخش دوم )
بزرگترین حسن, بزرگترین اشکال!
مفسر پایتون به شکل بسیار حرفه ای و پیچیده ای در زبان برنامه نویسی C پیاده سازی شده به طوری که خیلی از برنامه نویس های C هم نمی تونن به راحتی از کدهاش سر در بیارن. و خب مسلما با این شرایط میشه گفت جز تیم اصلی برنامه نویسی پایتون — که در صدر اون ها ون روسوم قرار داره – کسی نیست که بخواد به تمام جوانب طراحی این مفسر آشنا باشه. و تا حدودی هم نیازی به این آشنایی حس نمیشه چون در پایتون اصولا لازم نیست چیزی در مفسر تغییر کنه و بیشتر لازم داریم که چیزی به اون اضافه کنیم که این کار هم چندان سخت نیست.اما یه مبحث در ساختار طراحی پایتون بسیار شناخته شده است. مبحثی که همه می دونن چه مزایایی داره و چه خدمتی به مفسر پایتون کرده و از جهتی هم همه ازش متنفرن و همگی خواستار کنار گذاشتن این ساختار از مفسر پایتون شدن. این ساختار چیزی نیست جز ساختار معروف GIL یا Global Interpreter Lock که میشه تو فارسی اونو به شکل “قفل سراسری مفسر” ترجمه کرد.اما این GIL چیه و دقیقا چی کار میکنه. مسلما در طراحی مفسر پایتون برای بالا بردن سرعت و امکان انجام کارهای هم زمان از تکنیک چند نخی استفاده شده. در ضمن شما می تونید تکنیک چند نخی رو در برنامه هایی که توسط مفسر پایتون اجرا می شن هم به کار ببرید. اما استفاده از چند نخی همونطور که مزایایی داره می تونه خطراتی هم داشته باشه که بزرگترین اونها دخالت نخ های مختلف تو کار همدیگست.این وضعیت زمانی اتفاق می افته که یک نخ به طور ناخواسته به حریم نخ های دیگه وارد بشه که این وضعیت تو زبان هایی مثل C یا C++ و بقیه زبان های برنامه نویسی خیلی اتفاق می افته. این کار در سطح مفسر میتونه حرکت اجرایی مفسر رو کاملا مختل کنه و در سطح برنامه می تونه باعث به وجود اومدن خطاهای زمان اجرا بشه.از اون جایی که پایتون روی ساده تر کردن کارها تاکید داره, طراحان مفسر تصمیم گرفتن از ساختار GIL استفاده کنن. به این صورت که شما می توانید نخ های زیادی ایجاد کنید ولی در هر زمان فقط اجازه ی استفاده از یکی از اون ها رو دارید. وقتی برنامه از تکنیک چند نخی استفاده میکنه, GIL بعد از اینکه مقداری از کدهای هر نخ رو اجرا کرد, کار این نخ رو متوقف میکنه و وضعیت نخ رو در حافظه ذخیره میکنه, و بعد از این کار شروع به اجرای کدهای نخ بعدی میکنه و این کارو تا زمانی انجام میده که تمام کدهای موجود در نخ ها اجرا بشن و از اونجایی که در هر لحظه فقط یک نخ فعال میشه امکان تداخل نخ ها تو کار همدیگه خیلی کم تر میشه. GIL در سرتاسر مفسر پایتون پیاده سازی شده و علاوه بر اینکه روی کدهای شما تاثیر می ذاره, حرکات سطح پایین مفسر رو هم در بر میگیره و از همین جهت هستش که توسعه ی مفسر با استفاده از C اینقدر ساده هستش وگرنه شما مجبور بودید با مشکلات مربوط به چند نخی به طور مستقیم دست و پنجه نرم کنید. خب پس تا اینجای کار GIL میتونه :

استفاده از تکنیک چند نخی رو ساده تر کنه.
استفاده از تکنیک چند نخی رو امن تر کنه.
تغییر در مفسر رو راحت تر کنه.
توسعه ی مفسر رو راحت تر ساده تر کنه.

اما از طرفی هم :

نمی ذاره چند نخ به طور هم زمان اجرا بشن و فقط می تونه همزمانی رو شبیه سازی کنه.
نمی تونه از پردازنده ها و یا هسته های اضافی CPU استفاده کنه و همه ی کارها رو روی یه هسته انجام میده.

یه نکته ای که قابل ذکر هستش اینه که مفسر به کدهای خارجی کاری نداره. مثلا اگه تولکیت Qt از چند نخی استفاده می کنه, استفاده از اون در پایتون باعث تحت پوشش قرار گرفتن کار Qt توسط GIL نمیشه و اون خیلی راحت می تونه به طور واقعی از چند نخی استفاده کنه. البته موقع نوشتن رابط پایتون برای همچین برنامه هایی باید به یه سری نکاتی هم توجه بشه تا باعث به وجود اومدن مشکل نشه.

کاربران پایتون خواستار برداشته شدن این ساختار از مفسر هستن تا بتونن به طور واقعی از چند نخی استفاده کنن و همچنین از منابع اضافی مثل CPU های چند هسته ای هم بهره ببرن. ولی به دلایلی این کار به همین راحتی ها قابل انجام نیست:

GIL در سرتاسر مفسر استفاده شده و حذف اون اصلا ساده نیست.
حذف GIL می تونه باعث بشه مفسر یه بار دیگه از نو نوشته بشه.
از این به بعد دیگه باید مثل C++ خودتون مسئول مدیریت نخ هاتون باشید.
تمام توسعه های پایتون باید از اول نوشته بشن چون همشون بر پایه GIL هستن.
امکان داره مقدار زیادی سرعت رو از دست بدید!

این مورد آخر یک بار زمانی که پایتون در نسخه ی 1.5 قرار داشت آزمایش شد. یعنی GIL از مفسر حذف شد و باعث شد سرعت اجرای برنامه ای با یک نخ در پایتون به نصف سرعت قبلی برسه و چون خیلی از برنامه های پایتون از چند نخی استفاده نمی کنن این کار زیاد هم به صرفه نیست. اما امیدوارم این صحبت ها باعث نشه که فکر کنید در پایتون نمیشه از عملیات همزمانی واقعی استفاده کرد و یا فقط باید به یه CPU بسنده کرد. زبان پایتون نیازی به GIL نداره, این فقط پیاده سازی CPython که از این روش استفاده میکنه و شما توی Jython همچین چیزی رو ندارید. تو مقاله های بعدی بیشتر در مورد این زمینه ها صحبت میکنیم و راه حل های این مشکل رو مورد بررسی قرار میدیم.


کارها

اطلاعات

4 جواب

8 02 2008
علي جباري

من تازه شروع به یادگیری پایتون و کلا برنامه نویسی کردم. واقعا ساده است.( البته اولش!)
شما مثله اینکه با ریاضیات مشکلات اساسی و قدیمی دارید. میشه بگید با وجود این ضعف چجوری با برنامه نویسی و منطق اون به مشکلی برنخوردید؟

8 02 2008
امیررضا

اخ اخ از ریاضیات نگو که دلم خونه d:
خب حالا کی گفته برنامه نویسی نیاز به ریاضی قوی داره؟… برنامه نویسی شاخه شاخه هستش, مثلا واسه برنامه نویسی بازی تخصص تو ریاضیات لازمه ولی شاید واسه وب همچین چیز لازمی هم نباشه. به هر حال بستگی داره به خودت… البته پشت کار و تمرین هم مهمه. بحث یکی دو روز نیست. من اولین برنامه ایی که نوشتم چهارده سالم بود. الآن دیگه 6 سال از اون زمان گذشته, خیلی چیزها دستم اومده… نمی دونم شایدم خدا به جای هزار تا استعدادی که بهم نداده سعی کرده حداقل تو این یه مورد هوامو داشته باشه ((=

11 02 2008
علي جباري

پس اینطور.
یه سوال دیگه؟
حلقه و کلاس در پایتون(برنامه نویسی) برای انجام چه کاری ایجاد شدند؟

11 02 2008
امیررضا

خب حلقه ها واسه این هستن که بتونی یه کار چند بار پشت سر هم انجام بدی. مثلا برنامت صد بار بخواد بگه “salam” باید از حلقه ها استفاده کنه. اما مفهوم کلاس ها رو به این راحتی نمیتونم توضیح بدم. می تونی به لینک زیر بری و مقاله هامو در مورد شی گرایی و کلاس ها توی پایتون بخونی. حتما با خوندن اونها متوجه میشی ;)
http://www.pylearn.com/fa/forum/index.php?topic=454.0

دیدگاه‌تان را بنویسید: