Rumah pembangunan bahagian belakang Tutorial Python Concurrency dan Paralelisme dalam Python

Concurrency dan Paralelisme dalam Python

Jan 05, 2025 am 03:59 AM


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:

  • Apakah itu proses?
  • Apakah benang?
  • Apakah maksud terikat I/O dan terikat CPU?
  • Apakah Python GIL?
  • Apakah itu persaingan?
  • Apakah paralelisme?
  • Pustaka asyncio
  • Pustaka threading
  • Perpustakaan berbilang pemprosesan

Apakah proses?

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:

  • Konteks perkakasan: menyimpan kandungan daftar umum dan khusus CPU
  • Konteks perisian: menentukan sumber yang boleh diperuntukkan oleh proses
  • Ruang alamat: menentukan kawasan memori yang dimiliki oleh proses

Imej berikut diambil daripada buku oleh Francis Machado dan Luis Maia:

Concorrência e paralelismo em Python

Maklumat ini diperlukan untuk melaksanakan program.

Apakah benang?

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:

Concorrência e paralelismo em Python

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.

Apakah yang dimaksudkan dengan terikat I/O dan terikat CPU?

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.

Apakah GIL Python?

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:

Concorrência e paralelismo em Python

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).

Apakah persaingan?

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:

  • Berbilang tugas koperatif: dalam model ini kami menerangkan dalam kod titik di mana tugas boleh tukar. Dalam Python ini dicapai menggunakan gelung acara, corak reka bentuk biasa, menggunakan hanya satu utas dan satu teras CPU, menggunakan, sebagai contoh, asyncio dengan async dan menunggu
  • Preemptive multitasking: dalam model ini kami membiarkan sistem pengendalian mengendalikan suis. Dalam Python ini dicapai dengan lebih daripada satu thread dan satu teras CPU menggunakan, sebagai contoh, threading lib

Imej di bawah membantu meringkaskan konkurensi dalam Python:

Concorrência e paralelismo em Python

Apakah paralelisme?

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:

Concorrência e paralelismo em Python

Perpustakaan asyncio

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.

Perpustakaan threading

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.

Perpustakaan berbilang pemprosesan

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

<🎜>: Bubble Gum Simulator Infinity - Cara Mendapatkan dan Menggunakan Kekunci Diraja
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Sistem Fusion, dijelaskan
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1668
14
Tutorial PHP
1273
29
Tutorial C#
1256
24
Python: Permainan, GUI, dan banyak lagi Python: Permainan, GUI, dan banyak lagi Apr 13, 2025 am 12:14 AM

Python cemerlang dalam permainan dan pembangunan GUI. 1) Pembangunan permainan menggunakan pygame, menyediakan lukisan, audio dan fungsi lain, yang sesuai untuk membuat permainan 2D. 2) Pembangunan GUI boleh memilih tkinter atau pyqt. TKInter adalah mudah dan mudah digunakan, PYQT mempunyai fungsi yang kaya dan sesuai untuk pembangunan profesional.

Python vs C: Lengkung pembelajaran dan kemudahan penggunaan Python vs C: Lengkung pembelajaran dan kemudahan penggunaan Apr 19, 2025 am 12:20 AM

Python lebih mudah dipelajari dan digunakan, manakala C lebih kuat tetapi kompleks. 1. Sintaks Python adalah ringkas dan sesuai untuk pemula. Penaipan dinamik dan pengurusan memori automatik menjadikannya mudah digunakan, tetapi boleh menyebabkan kesilapan runtime. 2.C menyediakan kawalan peringkat rendah dan ciri-ciri canggih, sesuai untuk aplikasi berprestasi tinggi, tetapi mempunyai ambang pembelajaran yang tinggi dan memerlukan memori manual dan pengurusan keselamatan jenis.

Python dan Masa: Memanfaatkan masa belajar anda Python dan Masa: Memanfaatkan masa belajar anda Apr 14, 2025 am 12:02 AM

Untuk memaksimumkan kecekapan pembelajaran Python dalam masa yang terhad, anda boleh menggunakan modul, masa, dan modul Python. 1. Modul DateTime digunakan untuk merakam dan merancang masa pembelajaran. 2. Modul Masa membantu menetapkan kajian dan masa rehat. 3. Modul Jadual secara automatik mengatur tugas pembelajaran mingguan.

Python vs C: Meneroka Prestasi dan Kecekapan Python vs C: Meneroka Prestasi dan Kecekapan Apr 18, 2025 am 12:20 AM

Python lebih baik daripada C dalam kecekapan pembangunan, tetapi C lebih tinggi dalam prestasi pelaksanaan. 1. Sintaks ringkas Python dan perpustakaan yang kaya meningkatkan kecekapan pembangunan. 2. Ciri-ciri jenis kompilasi dan kawalan perkakasan meningkatkan prestasi pelaksanaan. Apabila membuat pilihan, anda perlu menimbang kelajuan pembangunan dan kecekapan pelaksanaan berdasarkan keperluan projek.

Yang merupakan sebahagian daripada Perpustakaan Standard Python: Senarai atau Array? Yang merupakan sebahagian daripada Perpustakaan Standard Python: Senarai atau Array? Apr 27, 2025 am 12:03 AM

Pythonlistsarepartofthestandardlibrary, sementara

Python: Automasi, skrip, dan pengurusan tugas Python: Automasi, skrip, dan pengurusan tugas Apr 16, 2025 am 12:14 AM

Python cemerlang dalam automasi, skrip, dan pengurusan tugas. 1) Automasi: Sandaran fail direalisasikan melalui perpustakaan standard seperti OS dan Shutil. 2) Penulisan Skrip: Gunakan Perpustakaan Psutil untuk memantau sumber sistem. 3) Pengurusan Tugas: Gunakan perpustakaan jadual untuk menjadualkan tugas. Kemudahan penggunaan Python dan sokongan perpustakaan yang kaya menjadikannya alat pilihan di kawasan ini.

Pembelajaran Python: Adakah 2 jam kajian harian mencukupi? Pembelajaran Python: Adakah 2 jam kajian harian mencukupi? Apr 18, 2025 am 12:22 AM

Adakah cukup untuk belajar Python selama dua jam sehari? Ia bergantung pada matlamat dan kaedah pembelajaran anda. 1) Membangunkan pelan pembelajaran yang jelas, 2) Pilih sumber dan kaedah pembelajaran yang sesuai, 3) mengamalkan dan mengkaji semula dan menyatukan amalan tangan dan mengkaji semula dan menyatukan, dan anda secara beransur-ansur boleh menguasai pengetahuan asas dan fungsi lanjutan Python dalam tempoh ini.

Python vs C: Memahami perbezaan utama Python vs C: Memahami perbezaan utama Apr 21, 2025 am 12:18 AM

Python dan C masing -masing mempunyai kelebihan sendiri, dan pilihannya harus berdasarkan keperluan projek. 1) Python sesuai untuk pembangunan pesat dan pemprosesan data kerana sintaks ringkas dan menaip dinamik. 2) C sesuai untuk prestasi tinggi dan pengaturcaraan sistem kerana menaip statik dan pengurusan memori manual.

See all articles