


Tingkah laku berbeza pembolehubah disegerakkan dalam sistem pengendalian yang berbeza
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Cara Menggunakan Python untuk Mencari Pengagihan Zipf Fail Teks

Bagaimana saya menggunakan sup yang indah untuk menghuraikan html?

Cara Bekerja Dengan Dokumen PDF Menggunakan Python

Cara Cache Menggunakan Redis dalam Aplikasi Django

Memperkenalkan Toolkit Bahasa Alam (NLTK)

Bagaimana untuk melakukan pembelajaran mendalam dengan Tensorflow atau Pytorch?
