Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Python-ның анықтамалық имплементациясы
Python reference implementation
CPython – Python бағдарламалау тілінің анықтамалық имплементациясы болып табылады. C және Python тілдерінде жазылған CPython – Python тілінің стандартты және ең көп қолданылатын нұсқасы. CPython интерпретатор да, компилятор да бола алады, себебі ол интерпретациялаудан бұрын Python кодын байт-кодқа аударады. Оның C тілі сияқты бірнеше тілдермен сыртқы функция интерфейсі бар, онда Python-нан өзге тілде байланыстарды (bindings) жасау қажет.
CPython is the reference implementation of the Python programming language. Written in C and Python, CPython is the default and most widely used implementation of the Python language. CPython can be defined as both an interpreter and a compiler as it compiles Python code into bytecode before interpreting it. It has a foreign function interface with several languages, including C, in which one must explicitly write bindings in a language other than Python.
Дизайн
CPython-ның ерекшелігі – әрбір CPython интерпретаторы процесінде жаһандық интерпретатор құлпын (GIL) пайдалануы. Яғни, бір процесте бір уақытта тек бір ғана жіп Python байт-кодын өңдей алады. Бұл көп жіптілікте мән жоқ дегенді білдірмейді. Көп жіптіліктің ең көп таралған жағдайы – жіптердің көпшілігі сыртқы процестердің аяқталуын күтуі. Мұндай жағдай, мысалы, бірнеше жіп бөлек клиенттерге қызмет көрсеткенде туындауы мүмкін. Бір жіп клиенттен жауап күтуде, екіншісі дерекқорына сұрау салудың орындалуын күтуде, ал үшіншісі Python кодын өңдеуде болуы мүмкін. Дегенмен, GIL CPython-ның CPU-ға көп жүктеме түсіретін алгоритмдерді Python кодында жүзеге асыратын процестерге қолайсыз екенін білдіреді, мұндай алгоритмдерді бірнеше ядроға бөлуге болады. Нақты қолданыстарда GIL маңызды кедергі тудыратын жағдайлар сирек кездеседі. Өйткені Python өзінен-өзі баяу тіл және көбінесе CPU-ға көп жүктеме түсіретін немесе уақытқа сезімтал операциялар үшін қолданылмайды. Python көбінесе жоғары деңгейде қолданылады және арнайы міндеттерді орындау үшін кітапханалардағы функцияларды шақырады. Бұл кітапханалар көбінесе Python-да жазылмаған, сондықтан Python кодын басқа жіпте орындауға болады, ал кітапхана функциясын шақыру кезінде процестердің бірі күтуде болуы мүмкін. CPU-ға жүктеме түсіретін міндетті орындау үшін шақырылған Python емес кітапхана GIL-ге бағынбайды және бірнеше процессорда шектеусіз көптеген жіптерді бір мезгілде орындай алады. Python кодын бір мезгілде орындауға тек көп тапсырмалы операциялық жүйе басқаратын жеке CPython интерпретатор процестері арқылы қол жеткізуге болады. Бұл бір мезгілдегі Python процестері арасындағы байланысты қиындатады, бірақ multiprocessing модулі бұл қиындықты аздап жеңілдетеді. Бұл Python кодын бір мезгілде орындаудан пайда көретін қолданыстарды шектеулі жүктемемен жүзеге асыруға мүмкіндік береді. GIL-дің болуы CPython-ның жүзеге асырылуын жеңілдетеді және Python кодын бір мезгілде орындаудан пайда таппайтын көп жіпті қолданыстарды жүзеге асыруды оңайлатады. Алайда, GIL болмаса, көп процессорлы қолданыстар барлық ортақ кодтың жіп қауіпсіз екеніне көз жеткізуі керек. GIL-ді жою туралы көптеген ұсыныстар жасалған, бірақ жалпы консенсус бойынша, көп жағдайларда GIL-дің артықшылықтары кемшіліктерінен басым. GIL кедергі тудыратын сирек жағдайларда, қолданыс көп процессорлық архитектураға негізделген болуы керек. Көбірек параллелизмге мүмкіндік беру үшін 2023 жылдың қазан айында бір Python процесінде әрбір суб-интерпретатор үшін жеке GIL-ді пайдалануға рұқсат беретін жақсарту шығарылды, бұл «бірлесіп жұмыс істеуге дайын жіптер» деп сипатталды. Бірнеше талқылардан кейін 2023 жылы Python 3.13 нұсқасынан бастап GIL-ді міндетті емес етуді ұсынатын жоба басталды, бұл нұсқа 2024 жылдың қазанында шығуы жоспарланған.
A particular feature of CPython is that it makes use of a global interpreter lock (GIL) on each CPython interpreter process, which means that within a single process, only one thread may be processing Python bytecode at any one time. This does not mean that there is no point in multithreading; the most common multithreading scenario is where threads are mostly waiting on external processes to complete. This can happen when multiple threads are servicing separate clients. One thread may be waiting for a client to reply, and another may be waiting for a database query to execute, while the third thread is actually processing Python code. However, the GIL does mean that CPython is not suitable for processes that implement CPU intensive algorithms in Python code that could potentially be distributed across multiple cores. In real world applications, situations where the GIL is a significant bottleneck are quite rare. This is because Python is an inherently slow language and is generally not used for CPU intensive or time sensitive operations. Python is typically used at the top level and calls functions in libraries to perform specialized tasks. These libraries are generally not written in Python, and Python code in another thread can be executed while a call to one of these underlying processes takes place. The non Python library being called to perform the CPU intensive task is not subject to the GIL and may concurrently execute many threads on multiple processors without restriction. Concurrency of Python code can only be achieved with separate CPython interpreter processes managed by a multitasking operating system. This complicates communication between concurrent Python processes, though the multiprocessing module mitigates this somewhat; it means that applications that really can benefit from concurrent Python code execution can be implemented with limited overhead. The presence of the GIL simplifies the implementation of CPython, and makes it easier to implement multi threaded applications that do not benefit from concurrent Python code execution. However, without a GIL, multiprocessing apps must make sure all common code is thread safe. Although many proposals have been made to eliminate the GIL, the general consensus has been that in most cases, the advantages of the GIL outweigh the disadvantages; in the few cases where the GIL is a bottleneck, the application should be built around the multiprocessing structure. To help allow more parallelism, an improvement was released in October 2023 to allow a separate GIL per subinterpreter in a single Python process and have been described as "threads with opt in sharing". After several debates, a project was launched in 2023 to propose making the GIL optional from version 3.13 of Python, which is scheduled for release in October 2024.
Жүксіз құз
Unladen Swallow – CPython-ның толыққанды үйлесімді және едәуір жылдам болуы үшін жасалған оптимизациялық тармағы болды. Ол CPython-ның арнайы виртуалды машинасына LLVM-ді пайдаланып құрылған уақытында компиляторды қосу арқылы мақсаттарына жетуді көздеді. Жоба CPython-нан бес есе жылдамдыққа қол жеткізуді мақсат еткен; алайда, бұл мақсатқа жетілмеді. Жобаны Google демеушілік етті, жобаның иелері – Томас Вутерс, Джеффри Яскин және Коллин Винтер – Google-дың толық уақытты қызметкерлері болды; бірақ жобаға үлес қосқандардың көпшілігі Google қызметкерлері емес еді. Unladen Swallow Google Code платформасында орналастырылған. Python тіліне қатысты көптеген нәрселер сияқты, Unladen Swallow атауы да Monty Python-ға сілтеме, атап айтқанда Monty Python және Ысқырық қасиетті Грааль (Monty Python and the Holy Grail) фильміндегі жүксіз қарлығаштардың жылдамдығы туралы әзілге қатысты. Барлық жарияланған мақсаттарына жетпесе де, Unladen Swallow негізгі Python нұсқасына қосылған бірнеше кодтарды жасады, мысалы cPickle модулін жақсарту. 2010 жылдың шілдесінде кейбір бақылаушылар жобаның тоқтатылған-ды әлде әлі де жалғасып жатыр ма екендігі туралы пікір білдірді, себебі 2009 жылғы 4-тоқсандық кезең әлі шығарылмаған еді. Unladen пошта тізіміндегі трафик 2010 жылдың қаңтарындағы 500 хабарламадан 2010 жылдың қыркүйегінде 10-нан да аз хабарламаға дейін төмендеді. Сондай-ақ, Unladen Google-дың қаржылық қолдауын жоғалтты деген хабарлар тарады. 2010 жылдың қарашасында жобаның басты әзірлеушілерінің бірі «Джеффри менің Google үшін маңыздырақ басқа жобаларға тартылғанымызды» хабарлады. 2009 жылғы 4-тоқсандық даму тармағы 2010 жылдың 26 қаңтарында құрылды, бірақ веб-сайтта ешқандай жарнама жасалмады. Бұдан өзге, ұзақ мерзімді жоспарларға қатысты және жоба Python 2.7 нұсқасын өткізіп алғандықтан, Python Enhancement Proposal (PEP) ұсынылды. Бұл біріктіруге біраз уақыт кеткен болар еді, себебі Unladen Swallow бастапқыда Python 2.6 негізінде құрылған, ал Python 3 осы нұсқамен үйлесімділікті бұзды (толық ақпарат алу үшін Python 3000 қараңыз). Алайда, кейіннен PEP қабылданбады. 2011 жылдың басында жоба тоқтатылғаны анық болды.
Unladen Swallow was an optimization branch of CPython, intended to be fully compatible and significantly faster. It aimed to achieve its goals by supplementing CPython's custom virtual machine with a just in time compiler built using LLVM. The project had stated a goal of a speed improvement by a factor of five over CPython; this goal was not met. The project was sponsored by Google, and the project owners, Thomas Wouters, Jeffrey Yasskin, and Collin Winter, are full time Google employees; however, most project contributors were not Google employees. Unladen Swallow was hosted on Google Code. Like many things regarding the Python language, the name Unladen Swallow is a Monty Python reference, specifically to the joke about the airspeed velocity of unladen swallows in Monty Python and the Holy Grail. Although it fell short of all published goals, Unladen Swallow did produce some code that got added to the main Python implementation, such as improvements to the cPickle module. In July 2010, some observers speculated on whether the project was dead or dying since the 2009 Q4 milestone had not yet been released. The traffic on Unladen's mailing list had decreased from 500 messages in January 2010 to fewer than 10 in September 2010. It has also been reported that Unladen lost Google's funding. In November 2010, one of the main developers announced that "Jeffrey and I have been pulled on to other projects of higher importance to Google." The 2009 Q4 development branch was created on 26 January 2010, but no advertising was made on the website. Further, regarding the long term plans, and as the project missed the Python 2.7 release, a Python Enhancement Proposal (PEP) This merging would have taken some time, since Unladen Swallow was originally based on Python 2.6 with which Python 3 broke compatibility (see Python 3000 for more details). However, the PEP was subsequently withdrawn. In early 2011, it became clear that the project was stopped.