Table of Contents
Locks: Preventing Simultaneous Access
Semaphores: Limiting Access to Resources
Events: Signaling Between Threads or Processes
A Few Gotchas
Home Backend Development Python Tutorial How can concurrency primitives like Locks, Semaphores, and Events be used in Python's threading or multiprocessing?

How can concurrency primitives like Locks, Semaphores, and Events be used in Python's threading or multiprocessing?

Jun 06, 2025 am 12:04 AM
python concurrent

In Python, Locks, Semaphores, and Events are used to coordinate threads or processes' access to shared resources. 1. Locks ensures that only one thread or process executes specific code blocks at a time to prevent race conditions; 2. Semaphores limits the number of resources accessed simultaneously, and is suitable for connection pools and other scenarios; 3. Events are used for thread or inter-process communication, waiting for signals through .wait() and sending signals. In addition, pay attention to the reentry of locks, the complexity of state sharing between processes, and avoiding excessive locking and performance degradation and deadlock problems.

How can concurrency primitives like Locks, Semaphores, and Events be used in Python\'s threading or multiprocessing?

In Python, concurrency primitives like Locks , Semaphores , and Events are essential for coordinating access to shared resources when working with threads or processes. They help prevent race conditions, manage resource availability, and signal between concurrent units of execution.

Here's how these tools work in practice with both threading and multiprocessing .


Locks: Preventing Simultaneous Access

A Lock is the most basic synchronization primitive. It ensures that only one thread or process can execute a particular block of code at a time.

  • In threading , you use threading.Lock() .
  • In multiprocessing , you use multiprocessing.Lock() (or get it from a Manager if needed across processes).

Why it matters: Without locks, multiple threads or processes might try to update a shared variable at the same time, leading to inconsistent data.

Example usage:

 import threading

counter = 0
lock = threading.Lock()

def increment():
    Global counter
    with lock:
        counter = 1

This guaranteees that only one thread will be inside the with lock: block at any given moment.

Note: For multiprocessing, you'll usually create the lock inside a Manager context or pass it through shared memory constructs.


Semaphores: Limiting Access to Resources

A Semaphore is like a counter that limits how many threads or processes can access a resource concurrently.

  • Use threading.Semaphore(n) to allow up to n concurrent accesses.
  • Use multiprocessing.Semaphore(n) similarly for processes.

When to use it: Great for controlling access to limited resources — think connection pools, limited file handles, or bandwidth caps.

Example scenario: You're downloading files and want to limit the number of simulateneous downloads to 3.

 import threading
import time

sem = threading.Semaphore(3)

def download_file(i):
    with sem:
        print(f"Downloading file {i}")
        time.sleep(2)
        print(f"Finished file {i}")

for i in range(5):
    threading.Thread(target=download_file, args=(i,)).start()

This ensures no more than 3 threads run the critical section at once.


Events: Signaling Between Threads or Processes

An Event is a simple communication mechanism used to signal that something has happened.

  • Use threading.Event() or multiprocessing.Event() .
  • One thread/process waits on .wait() , and another signals via .set() .

Use case: You might have a background thread waiting for a trigger before proceeding.

Example:

 import threading
import time

event = threading.Event()

def wait_for_signal():
    print("Waiting for signal...")
    event.wait()
    print("Signal received!")

threading.Thread(target=wait_for_signal).start()

time.sleep(2)
print("Sending signal")
event.set()

This pattern is useful for pausing and recovering operations, or triggering actions after setup completes elsewhere.

In multiprocessing, events behave similarly but must be shared explicitly — often using multiprocessing.Manager() or passed through Process arguments.


A Few Gotchas

  • Locks are re-entrant? Not all are. If you need a thread to acquire the same lock multiple times without deadlocking, use threading.RLock() instead of a regular Lock .
  • Shared state is tricky in multiprocessing. Variables aren't automatically shared between processes, so use Value , Array , or Manager objects when sharing state.
  • Avoid over-locking. Only protect what needs protection. Excessive locking can hurt performance and introduce deadlocks.

These concurrency primitives are powerful, but they're also easy to misuse. Understanding which one to use — and when — makes writing safe, efficient concurrent code in Python much easier.

Basically that's it.

The above is the detailed content of How can concurrency primitives like Locks, Semaphores, and Events be used in Python's threading or multiprocessing?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What are class methods in Python What are class methods in Python Aug 21, 2025 am 04:12 AM

ClassmethodsinPythonareboundtotheclassandnottoinstances,allowingthemtobecalledwithoutcreatinganobject.1.Theyaredefinedusingthe@classmethoddecoratorandtakeclsasthefirstparameter,referringtotheclassitself.2.Theycanaccessclassvariablesandarecommonlyused

python asyncio queue example python asyncio queue example Aug 21, 2025 am 02:13 AM

asyncio.Queue is a queue tool for secure communication between asynchronous tasks. 1. The producer adds data through awaitqueue.put(item), and the consumer uses awaitqueue.get() to obtain data; 2. For each item you process, you need to call queue.task_done() to wait for queue.join() to complete all tasks; 3. Use None as the end signal to notify the consumer to stop; 4. When multiple consumers, multiple end signals need to be sent or all tasks have been processed before canceling the task; 5. The queue supports setting maxsize limit capacity, put and get operations automatically suspend and do not block the event loop, and the program finally passes Canc

How to run a Python script and see the output in a separate panel in Sublime Text? How to run a Python script and see the output in a separate panel in Sublime Text? Aug 17, 2025 am 06:06 AM

ToseePythonoutputinaseparatepanelinSublimeText,usethebuilt-inbuildsystembysavingyourfilewitha.pyextensionandpressingCtrl B(orCmd B).2.EnsurethecorrectbuildsystemisselectedbygoingtoTools→BuildSystem→Pythonandconfirming"Python"ischecked.3.Ifn

How to use regular expressions with the re module in Python? How to use regular expressions with the re module in Python? Aug 22, 2025 am 07:07 AM

Regular expressions are implemented in Python through the re module for searching, matching and manipulating strings. 1. Use re.search() to find the first match in the entire string, re.match() only matches at the beginning of the string; 2. Use brackets() to capture the matching subgroups, which can be named to improve readability; 3. re.findall() returns all non-overlapping matches, and re.finditer() returns the iterator of the matching object; 4. re.sub() replaces the matching text and supports dynamic function replacement; 5. Common patterns include \d, \w, \s, etc., you can use re.IGNORECASE, re.MULTILINE, re.DOTALL, re

How to build and run Python in Sublime Text? How to build and run Python in Sublime Text? Aug 22, 2025 pm 03:37 PM

EnsurePythonisinstalledbyrunningpython--versionorpython3--versionintheterminal;ifnotinstalled,downloadfrompython.organdaddtoPATH.2.InSublimeText,gotoTools>BuildSystem>NewBuildSystem,replacecontentwith{"cmd":["python","-

How to use variables and data types in Python How to use variables and data types in Python Aug 20, 2025 am 02:07 AM

VariablesinPythonarecreatedbyassigningavalueusingthe=operator,anddatatypessuchasint,float,str,bool,andNoneTypedefinethekindofdatabeingstored,withPythonbeingdynamicallytypedsotypecheckingoccursatruntimeusingtype(),andwhilevariablescanbereassignedtodif

How to pass command-line arguments to a script in Python How to pass command-line arguments to a script in Python Aug 20, 2025 pm 01:50 PM

Usesys.argvforsimpleargumentaccess,whereargumentsaremanuallyhandledandnoautomaticvalidationorhelpisprovided.2.Useargparseforrobustinterfaces,asitsupportsautomatichelp,typechecking,optionalarguments,anddefaultvalues.3.argparseisrecommendedforcomplexsc

How to debug a remote Python application in VSCode How to debug a remote Python application in VSCode Aug 30, 2025 am 06:17 AM

To debug a remote Python application, you need to use debugpy and configure port forwarding and path mapping: First, install debugpy on the remote machine and modify the code to listen to port 5678, forward the remote port to the local area through the SSH tunnel, then configure "AttachtoRemotePython" in VSCode's launch.json and correctly set the localRoot and remoteRoot path mappings. Finally, start the application and connect to the debugger to realize remote breakpoint debugging, variable checking and code stepping. The entire process depends on debugpy, secure port forwarding and precise path matching.

See all articles