Ya, saya telah berhenti menerbitkan di sini, tetapi dari sudut pemasaran adalah lebih baik untuk meneruskan penerbitan... Kami teruskan.
Teks asalnya diterbitkan di sini.
Objektif teks ini adalah untuk memberikan ringkasan langsung konsep asas yang diperlukan untuk memahami keselarasan dan keselarian dalam bahasa Python. Saya mengesyorkan mempunyai latar belakang minimum mengenai subjek atau menggabungkan teks ini dengan kajian daripada sumber lain. Semua rujukan ada di penghujung teks.
Saya akan membincangkan topik berikut:
Dalam pengkomputeran, proses ialah contoh aplikasi yang sedang berjalan. Jika anda membuka aplikasi pada komputer anda, seperti penyemak imbas, aplikasi itu akan dikaitkan dengan beberapa proses. Satu proses terdiri daripada:
Imej berikut diambil daripada buku oleh Francis Machado dan Luis Maia:
Maklumat ini diperlukan untuk melaksanakan program.
Benang ialah subrutin program, menjadi unit terkecil pelaksanaan yang diuruskan oleh sistem pengendalian dan komponen proses.
Pelbagai urutan proses hipotetikal boleh dilaksanakan secara serentak (yang akan kita fahami sebentar lagi), berkongsi sumber seperti ingatan. Proses yang berbeza tidak berkongsi sumber ini.
Imej di bawah diambil dari Wikipedia:
Mentafsir imej di atas, kita boleh mengekstrak bahawa atur cara disimpan pada cakera (memori sekunder, tidak meruap) dan termasuk beberapa arahan, dan boleh dijadikan instantiated (dimulakan) dalam satu atau lebih proses, dan ini pula boleh mempunyai beberapa urutan yang berkaitan.
Dua ungkapan ini banyak muncul dalam perbincangan tentang persaingan dan boleh muncul dalam bahasa Portugis dengan I/O (input/output) dan CPU (unit pemprosesan pusat).
Apabila kita bercakap tentang terikat I/O dan terikat CPU, kita bercakap tentang faktor pengehad yang menghalang operasi daripada berjalan lebih pantas pada komputer kita, dan kita boleh menemui dua jenis operasi ini dalam pangkalan kod yang sama.
Operasi terikat CPU adalah intensif CPU dan akan berjalan lebih pantas jika CPU lebih berkuasa. Dalam erti kata lain, jika kita beralih dari kelajuan jam 2GHz ke 4GHz, operasi ini mungkin akan berjalan lebih pantas. Kami bercakap di sini tentang operasi yang melakukan banyak pengiraan, pengiraan; contohnya, cara mengira Pi.
Operasi terikat I/O bergantung pada kelajuan rangkaian dan kelajuan peranti input dan output. Membuat permintaan kepada pelayan web atau membaca fail daripada cakera adalah operasi terikat I/O.
Kedua-dua jenis operasi boleh mendapat manfaat daripada penggunaan concurrency.
GIL bermaksud kunci penterjemah global, yang bertujuan untuk menghalang proses Python daripada melaksanakan lebih daripada satu kod bait arahan Python pada masa yang sama. Untuk menjalankan thread adalah perlu untuk "memperoleh" GIL dan semasa satu thread memegang GIL thread lain tidak boleh memperolehnya pada masa yang sama. Ini tidak bermakna kita tidak boleh mempunyai lebih daripada satu urutan dalam konteks ini.
Di sini kami sedang mempertimbangkan pelaksanaan rujukan Python. CPython ialah pelaksanaan standard Python, digunakan sebagai rujukan untuk tingkah laku bahasa. Terdapat pelaksanaan lain, seperti Jython atau IronPython. GIL hadir dalam CPython dan baru-baru ini kami ada PEP (Python Enhancement Proposal) yang mencadangkan untuk menjadikan GIL sebagai pilihan.
Idea GIL adalah untuk mengelakkan keadaan perlumbaan, yang boleh timbul apabila lebih daripada satu utas perlu merujuk objek Python pada masa yang sama. Jika lebih daripada satu utas mengubah suai pembolehubah yang dikongsi, pembolehubah itu mungkin berada dalam keadaan yang tidak dijangka. Imej diambil dari buku Matthew Fowler:
Dalam imej di atas, dua utas cuba meningkatkan kiraan rujukan secara serentak, dan bukannya kiraan memberi 2, memandangkan kedua-duanya meningkat 1, hasil akhir memberi 1 (setiap utas ialah lajur).
Persaingan dalam pengkomputeran berlaku apabila berurusan dengan lebih daripada satu tugasan, tanpa semestinya melaksanakan kedua-dua tugasan ini pada masa yang sama. Frasa terkenal daripada Rob Pyke mengenai subjek:
Persaingan bermaksud berurusan dengan banyak perkara pada masa yang sama. Paralelisme ialah melakukan banyak perkara pada masa yang sama.
Fikirkan tentang situasi hipotesis ini: jika anda akan membuat dua kek, anda boleh mulakan dengan memanaskan ketuhar dan sementara itu, sediakan doh untuk kek pertama. Setelah ketuhar berada pada suhu yang betul, anda boleh meletakkan doh untuk kek pertama di dalam ketuhar dan, sementara menunggu kek naik di dalam ketuhar, anda boleh menyediakan doh untuk kek kedua. Idea persaingan pada dasarnya adalah ini, anda tidak perlu melahu, tersekat, berhenti, sambil menunggu tugasan selesai, anda boleh melakukan suis dan menukar tugas.
Dalam konteks ini kita mempunyai dua jenis multitasking:
Imej di bawah membantu meringkaskan konkurensi dalam Python:
Paralelisme bermaksud bahawa lebih daripada satu tugasan sedang dilaksanakan pada masa yang sama. Dalam erti kata lain, keselarian membayangkan keselarasan (berurusan dengan lebih daripada satu tugas), tetapi keselarasan tidak menunjukkan keselarian (tugas tidak semestinya dilaksanakan secara selari pada masa yang sama). Agar keselarian dapat dilaksanakan, kami memerlukan lebih daripada satu teras CPU.
Dalam Python keselarian dicapai, sebagai contoh, dengan lib multiprocessing, di mana kita akan mempunyai lebih daripada satu proses Python, setiap satu dengan GIL sendiri. Imej membantu menggambarkan keselarian dalam Python:
Terdapat cara berbeza untuk mencapai konkurensi dan keselarian dalam Python dan kami boleh menggunakan beberapa perpustakaan untuk mengoptimumkan kod kami, bergantung pada jenis operasi yang kami hadapi, terikat I/O atau terikat CPU. asyncio ialah lib untuk mencapai konkurensi menggunakan async dan menunggu. Daripada dokumentasi:
Asyncio digunakan sebagai asas untuk beberapa rangka kerja Python tak segerak yang menyediakan rangkaian berprestasi tinggi dan pelayan web, perpustakaan sambungan pangkalan data, baris gilir kerja teragih, dll.
Seperti yang anda boleh bayangkan, lib ini sesuai untuk mengoptimumkan tugas terikat I/O, di mana kami mempunyai masa menunggu rangkaian, menulis ke cakera, dsb. Dalam operasi terikat CPU tidak perlu menunggu, kami hanya bergantung pada kelajuan pengiraan CPU.
Lib threading Python membolehkan kami mengendalikan lebih daripada satu utas, namun, kami masih berurusan dengan satu teras CPU dan satu proses Python, dan ingat bahawa ini adalah kes multitasking awalan di mana sistem pengendalian melakukannya pertukaran tugas untuk kita. Lib juga lebih berguna untuk mengoptimumkan operasi terikat I/O.
Mengenai threading, tapak web Real Python menyediakan beberapa perkara penting:
Oleh kerana sistem pengendalian mengawal masa satu tugasan akan berhenti dan satu lagi tugasan akan bermula, sebarang data yang dikongsi antara urutan perlu dilindungi atau selamat untuk benang. Malangnya permintaan.Session() bukan selamat untuk benang. Terdapat beberapa strategi untuk menjadikan akses data selamat untuk benang bergantung pada data itu dan cara anda menggunakannya. Salah satunya ialah menggunakan struktur data selamat-benang sebagai Baris Gilir modul baris gilir Python.
Kami menemui dokumentasi baris gilir di sini.
Mengenai lib berbilang pemprosesan dalam dokumentasi Python:
pemprosesan berbilang ialah pakej yang menyokong proses penjanaan menggunakan API yang serupa dengan modul penjalinan. Pakej multiprocessing menyediakan kedua-dua konkurensi tempatan dan jauh, dengan berkesan memintas GIL dengan menggunakan sub-proses dan bukannya benang. Itulah sebabnya modul pemproses berbilang membolehkan pengaturcara mengambil kesempatan daripada berbilang pemproses pada satu mesin.
Perlu diingatkan bahawa menjalankan lebih daripada satu proses pada teras CPU yang berbeza tidak bermakna melumpuhkan GIL, sebaliknya setiap proses akan mempunyai GIL sendiri. Dengan memanfaatkan lebih daripada satu teras CPU, berkongsi beban kerja CPU yang berat antara berbilang teras yang tersedia, lib lebih sesuai untuk terikat CPU.
Sumber:
FOWLER, Matthew. Python Concurrency dengan asyncio. Penerbitan Manning, 2022.
MACHADO, Francis Berenger; MAIA, Luiz Paulo. Seni Bina Sistem Pengendalian: Termasuk Latihan dengan Simulator SOSIM dan Soalan ENADE. Rio de Janeiro: LTC, 2013.
Benang (pengkomputeran) oleh Wikipedia
Percepatkan Program Python Anda Dengan Concurrency by Real Python
Atas ialah kandungan terperinci Concurrency dan Paralelisme dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!