Tingkah laku berbeza pembolehubah disegerakkan dalam sistem pengendalian yang berbeza

Barbara Streisand
Lepaskan: 2024-11-10 03:13:02
asal
443 orang telah melayarinya

Synchronized 变量在不同操作系统的不同行为

SEO:

  • Nilai pembolehubah yang disegerakkan Python tidak berubah dalam konteks global
  • Nilai disegerakkan tidak diubah suai dalam proses utama
  • Nilai disegerakkan tidak dikongsi antara proses

Dalam pustaka multiprocessing Python, terdapat multiprocessing.sharedctypes.synchronized, jenis pembungkus yang digunakan untuk berkongsi data antara proses yang berbeza Secara lalai, kunci masuk semula RLock digunakan untuk mengekalkan konsistensi data. Sebelum mempelajari semula Python kali ini, saya menggunakan Python 3.6 Walaupun saya telah menggunakan beberapa pengetahuan cetek tentang perpustakaan mp pada masa itu, saya tidak mempertimbangkan secara mendalam kelakuan berbeza program berbilang proses pada sistem pengendalian yang berbeza dan kemungkinan kesannya.

Semasa belajar kali ini, saya menghadapi masalah: apabila saya mencipta pembolehubah multiprocessing.sharedctypes.Value dalam konteks global menggunakan Python 3.12 pada sistem macOS, jika saya mengakses pembolehubah ini dalam proses baharu, nilainya Penyegerakan tidak dikekalkan antara proses yang berbeza. Selepas berbincang dengan cikgu Eric Greene, saya mendapati bahawa sejak Python 3.8, cara untuk mencipta proses baharu dalam sistem pengendalian yang berbeza telah berubah:

  • Sistem Linux sentiasa menggunakan garpu untuk mencipta proses baharu. Semasa fork, semua sumber proses induk diwarisi oleh proses anak, jadi pembolehubah penyegerakan yang ditakrifkan secara global dalam proses induk juga boleh diakses oleh proses anak, jadi ketekalan data dikekalkan
  • Sistem Windows sentiasa menggunakan spawn, iaitu kaedah mencipta proses penterjemah Python baharu untuk melaksanakan pelbagai pemprosesan. Ia bersamaan dengan Python "membuka lebih banyak", jadi terdapat lebih banyak overhed dan kecekapan yang lebih rendah, tetapi ini adalah had sistem Windows itu sendiri. Dalam kes ini, proses anak hanya mewarisi sumber yang diperlukan oleh kaedah run() proses induk untuk memulakan proses baharu.
  • Sistem macOS menggunakan fork sebelum Python 3.8, dan kemudian bertukar kepada spawn, jadi beberapa gelagat berbilang proses telah berubah. (macOS masih boleh ditetapkan untuk menggunakan garpu, tetapi Python tidak disyorkan secara rasmi)

Dalam contoh saya, kerana pembolehubah Disegerakkan diisytiharkan secara global dalam proses induk, ia tidak akan diwarisi oleh proses anak pada sistem Windows dan macOS, jadi nilainya berbeza antara proses yang berbeza pada sistem Linux , semua sumber proses induk diwarisi, jadi proses anak boleh mengubah nilainya.

Ini menyebabkan fenomena yang saya lihat: pembolehubah penyegerakan global kod saya pada macOS tidak berubah manakala sistem Linux orang lain berjalan secara normal dan pembolehubah disegerakkan antara semua proses.

Bacaan rujukan:

  • https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods
  • https://docs.python.org/3/library/multiprocessing.html#multiprocessing.sharedctypes.synchronized

Atas ialah kandungan terperinci Tingkah laku berbeza pembolehubah disegerakkan dalam sistem pengendalian yang berbeza. 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