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

R-Lock vs Lock dalam Python

DDD
Lepaskan: 2025-01-24 18:12:10
asal
947 orang telah melayarinya

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:

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()
Salin selepas log masuk

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:

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()
Salin selepas log masuk

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 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan