
PYTHON THREADS AND PROCESSES | PYTHON FULL COURSE
Python provides two main ways to perform multitasking: threads and processes. Understanding their differences and appropriate use cases is key to writing efficient, concurrent applications.
Threads
Definition: Threads are lightweight, share the same memory space, and are used for tasks that require minimal CPU but perform I/O-bound operations.
Python's Global Interpreter Lock (GIL):
In CPython (Python’s default implementation), the GIL prevents multiple threads from executing Python bytecode simultaneously.
This makes threading less effective for CPU-bound tasks but suitable for I/O-bound tasks.
Example of Using Threads
python
Copy code
import threading
import time
def print_numbers():
for i in range(5):
print(f"Number: {i}")
time.sleep(1)
Creating threads
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_numbers)
Starting threads
thread1.start()
thread2.start()
Wait for threads to finish
thread1.join()
thread2.join()
print("Threads completed!")
Processes
Definition: Processes run in separate memory spaces and are suitable for CPU-bound tasks since they are not affected by the GIL.
Multiprocessing: Python’s multiprocessing module creates separate processes to execute code concurrently.
Example of Using Processes
python
Copy code
from multiprocessing import Process
import os
def print_process_info():
print(f"Process ID: {os.getpid()}")
Creating processes
process1 = Process(target=print_process_info)
process2 = Process(target=print_process_info)
Starting processes
process1.start()
process2.start()
Wait for processes to finish
process1.join()
process2.join()
print("Processes completed!")
Key Differences Between Threads and Processes
Feature Threads Processes
Memory Shared memory space Separate memory space
Overhead Low overhead Higher overhead
Concurrency Type I/O-bound tasks CPU-bound tasks
GIL Impact Affected by the GIL Not affected by the GIL
Communication Easier (shared memory) Requires inter-process communication (IPC)
When to Use Threads vs. Processes
Use threads when:
Your application is I/O-bound (e.g., reading/writing files, making API calls, etc.).
Low memory consumption is required.
Use processes when:
Your application is CPU-bound (e.g., numerical computations, data processing).
You need true parallelism.
Combining Threads and Processes
For some workloads, combining threads and processes can be beneficial. For example, use threads for I/O operations within a multiprocessing pool.
Example: Multiprocessing with Threads
python
Copy code
from multiprocessing import Pool
import threading
def thread_task(task_id):
print(f"Thread {task_id} running")
def process_task():
threads = [threading.Thread(target=thread_task, args=(i,)) for i in range(3)]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
if _name_ == "__main__":
with Pool(2) as pool: # 2 processes
pool.map(lambda _: process_task(), range(2))
Would you like help with a specific use case involving threading, multiprocessing, or both?
コメント