Saya telah membaca banyak artikel dalam talian dan saya masih keliru. Bolehkah sesiapa menerangkan kedua-dua konsep ini kepada saya dengan cara yang mudah difahami?
Dalam pengekodan berbilang benang Python, saya biasanya menggunakan seketika True infinite loop dalam kaedah run thread, kemudian panggil queue.task_done di hujung badan gelung gelung infinite untuk mengalih keluar baris gilir, dan kemudian panggil baris gilir kaedah bergabung dalam utas utama untuk menyekat utas utama menghalang utas utama daripada tamat secara langsung Adakah kaedah pengekodan berbilang benang ini munasabah. Adakah terdapat sebarang pepijat? Di samping itu, saya ingin bertanya sama ada gelung tak terhingga yang saya panggil dalam larian dipanggil kunci putaran?
Pertama sekali, anda mesti faham apa itu kunci mutex dan maksudnya
Ia adalah apabila dua utas A dan B mengakses memori yang sama.
Sebaik-baiknya, perintah pelaksanaan kami ialah selepas A dilaksanakan sepenuhnya, B akan dilaksanakan, namun, pelaksanaan akan menduduki masa arahan CPU Jika tiada mekanisme digunakan, apabila A dilaksanakan separuh jalan, B akan menduduki CPU B akan menduduki CPU Untuk memproses memori ini, kemudian B menyelesaikan pelaksanaan, dan A mendapat CPU semula, bukankah data memori itu salah?
Untuk keselamatan data memori. Teknologi yang saling eksklusif digunakan Apabila A mengakses memori ini, ia mula-mula menentukan sama ada memori ini mempunyai bendera yang digunakan (bernama kunci Jika tidak, ia menambah bendera (kunci) pada memori ini memori, dan A membuka kuncinya selepas pemprosesan. Jika B datang untuk mengakses semasa A sedang memproses memori, B akan melihat bahawa memori ini mempunyai tanda sedang digunakan (kunci), dan B boleh mempunyai beberapa gelagat. Kelakuan 1: Mengambil CPU. Gelung dan uji status kunci secara berterusan Benang tidak akan tergantung (tidur) dan berada dalam keadaan menunggu yang sibuk Kunci yang menggunakan tingkah laku ini dipanggil kunci putaran. Kelakuan 2: Benang B tidur dan terhalang, menyerahkan CPU sehingga A selesai melaksanakan dan kunci hilang, kemudian menggunakan memori. Tingkah laku ini dipanggil kunci mutex. Selepas melihat ini, anda mungkin faham bahawa kunci ialah mekanisme penyegerakan yang melaksanakan pengecualian bersama. Kunci putaran hanyalah kes kunci mutex (ia akan menduduki kunci mutex CPU semasa menunggu).
Jangan terpedaya dengan nama. Untuk memahami mekanisme di sebaliknya, anda perlu memahaminya walaupun anda menukar nama,
Pautan rujukan Penerangan pautan
1. Apabila menggunakan gelung sementara dalam kaedah larian berbilang benang Python, jika mekanisme program berhenti tidak digunakan dalam badan gelung, ia akan terus berjalan, jika anda ingin membuat kod dengan betul, anda boleh menggunakan semaphore atau mekanisme pembolehubah lain untuk memberitahu badan gelung Berhenti, atau tentukan sama ada baris gilir kosong, putus terus dan keluar dari gelung.
2. Gelung tak terhingga dalam larian bukanlah kunci putaran Jika terdapat persaingan sumber dalam gelung, kunci akan ditambah, tetapi kunci ini juga merupakan kunci pengecualian bersama.
Kunci Python menggunakan semaphore, bukan spinlock.
Kunci putaran: Berbilang utas mengakses sumber yang sama pada masa yang sama Kunci yang ditetapkan untuk mengelakkan bacaan dan pengubahsuaian sumber yang tidak konsisten Jika utas sudah menduduki sumber apabila utas mengakses sumber, maka utas yang terakhir akan menunggu semasa. utas untuk melepaskan sumber Pada masa ini, yang terakhir (tanpa tidur) terus menjalankan CPU untuk mengesan sama ada sumber yang diduduki oleh yang pertama dilepaskan Mekanisme yang membolehkannya mengakses dan mengesan penggunaan sumber secara berterusan ialah kunci putaran.
Kunci Mutex: Tujuannya adalah sama dengan kunci putaran, tetapi mekanismenya berbeza Apabila utas menduduki sumber, kunci ditambahkan Apabila utas terakhir mengakses sumber, ia memasuki keadaan tidur kerana sumber telah diisi , dan menunggu sumber dikeluarkan Akhirnya, benang menunggu dimaklumkan melalui semaphore.
Kod Python akan berjalan mengikut proses ini,
Sediakan GIL
Tukar ke benang tertentu
Lari
Benang keluar dan ditetapkan kepada keadaan tidur
Buka kunci GIL
Ulang operasi di atas
Mungkin kerana GIL, saya nampaknya tidak pernah melihat kunci putaran dalam Python, dan kunci mutex kebanyakannya digunakan.
Berikut adalah kaedah yang saya gunakan untuk menulis multi-threading, untuk rujukan sahaja~
Memandangkan ia adalah baris gilir, Queue().get() dalam Queue menerangkan Alih keluar dan kembalikan item daripada baris gilir.