Rumah >pembangunan bahagian belakang >Tutorial Python >R-Lock vs Lock dalam Python

R-Lock vs Lock dalam Python

DDD
DDDasal
2025-01-24 18:12:10862semak imbas

R-Lock vs Lock in Python

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>

LockMemilih Antara RLock dan

  • LockLebih suka
  • untuk senario penguncian yang mudah di mana kemasukan semula tidak diperlukan. Ia lebih ringkas dan selalunya lebih pantas.
  • RLockPilih
  • 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