Modul threading
Python menawarkan dua alat penyegerakan penting: Lock
dan RLock
, kedua-duanya direka untuk mengawal akses kepada sumber kongsi dalam aplikasi berbilang benang. Walau bagaimanapun, fungsinya berbeza dengan ketara.
1. Lock
(benang.Kunci)
-
Mekanisme: Mekanisme penguncian asas. Hanya satu benang boleh memegang kunci pada bila-bila masa. Sebarang benang lain yang cuba memperoleh akan disekat sehingga kunci dilepaskan.
-
Kemas masuk semula: Tidak masuk semula. Benang yang sudah mempunyai kunci tidak boleh memperolehnya semula; percubaan untuk berbuat demikian mengakibatkan kebuntuan.
-
Aplikasi: Sesuai untuk situasi di mana benang memerlukan kunci sekali sahaja, melepaskannya setelah tugas selesai.
Lock
Contoh:
<code class="language-python">import threading
lock = threading.Lock()
def critical_section():
lock.acquire()
try:
print(f"{threading.current_thread().name} is accessing the shared resource.")
finally:
lock.release()
thread1 = threading.Thread(target=critical_section)
thread2 = threading.Thread(target=critical_section)
thread1.start()
thread2.start()
thread1.join()
thread2.join()</code>
2. RLock
(benang.Rlock)
-
Mekanisme: Kunci masuk semula, membenarkan benang memperoleh kunci yang sama beberapa kali tanpa menyebabkan kebuntuan. Setiap pemerolehan memerlukan keluaran yang sepadan.
-
Kemasukan Semula: Penyertaan Semula. Seutas benang boleh memperoleh semula kunci yang telah dipegangnya, dengan syarat ia melepaskannya dengan bilangan kali yang sama.
-
Aplikasi: Sesuai untuk senario yang melibatkan fungsi rekursif atau operasi terlindung kunci bersarang di mana benang mungkin memerlukan kunci yang sama berulang kali.
RLock
Contoh:
<code class="language-python">import threading
rlock = threading.RLock()
def recursive_task(count):
rlock.acquire()
try:
print(f"{threading.current_thread().name} acquired the lock; count = {count}")
if count > 0:
recursive_task(count - 1) # Recursive call; re-acquires the lock
finally:
rlock.release()
thread = threading.Thread(target=recursive_task, args=(3,))
thread.start()
thread.join()</code>
Perbezaan Utama: Lock
lwn. RLock
Ciri |
Feature |
Lock (threading.Lock) |
RLock (threading.RLock) |
Reentrancy |
Non-reentrant |
Reentrant |
Use Case |
Simple locking |
Recursive/nested locking |
Performance |
Generally faster |
Slightly more overhead |
(benang.Kunci) |
(threading.RLock) |
Kemasukan Semula |
Tidak masuk semula |
Peserta semula |
Kes Penggunaan |
Penguncian mudah |
Penguncian rekursif/bersarang |
Prestasi |
Secara amnya lebih pantas |
Lebih tinggi sedikit |
table>
Lock
Memilih Antara RLock
dan
-
Lock
Lebih suka untuk senario penguncian yang mudah di mana kemasukan semula tidak diperlukan. Ia lebih ringkas dan selalunya lebih pantas.-
RLock
Pilih apabila berurusan dengan fungsi rekursif atau penguncian bersarang, mengelakkan kemungkinan kebuntuan. Kerumitan tambahan ini dibenarkan oleh pencegahan kebuntuan dalam situasi khusus ini.
Atas ialah kandungan terperinci R-Lock vs Lock dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Kenyataan: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