Rumah > pembangunan bahagian belakang > Tutorial Python > Concurrency dan Paralelisme dalam Python

Concurrency dan Paralelisme dalam Python

Patricia Arquette
Lepaskan: 2025-01-05 03:59:39
asal
934 orang telah melayarinya

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!

sumber:dev.to
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan