1111This module constructs higher-level threading interfaces on top of the lower
1212level :mod: `_thread ` module.
1313
14+ .. include :: ../includes/wasm-notavail.rst 
15+ 
16+ Introduction
17+ ------------ 
18+ 
19+ The :mod: `!threading ` module provides a way to run multiple `threads 
20+ <https://en.wikipedia.org/wiki/Thread_(computing)> `_ (smaller
21+ units of a process) concurrently within a single process. It allows for the
22+ creation and management of threads, making it possible to execute tasks in
23+ parallel, sharing memory space. Threads are particularly useful when tasks are
24+ I/O bound, such as file operations or making network requests,
25+ where much of the time is spent waiting for external resources.
26+ 
27+ A typical use case for :mod: `!threading ` includes managing a pool of worker
28+ threads that can process multiple tasks concurrently.  Here's a basic example of
29+ creating and starting threads using :class: `~threading.Thread `::
30+ 
31+    import threading 
32+    import time 
33+ 
34+    def crawl(link, delay=3): 
35+        print(f"crawl started for {link}") 
36+        time.sleep(delay)  # Blocking I/O (simulating a network request) 
37+        print(f"crawl ended for {link}") 
38+ 
39+    links = [ 
40+        "https://python.org", 
41+        "https://docs.python.org", 
42+        "https://peps.python.org", 
43+    ] 
44+ 
45+    # Start threads for each link 
46+    threads = [] 
47+    for link in links: 
48+        # Using `args` to pass positional arguments and `kwargs` for keyword arguments 
49+        t = threading.Thread(target=crawl, args=(link,), kwargs={"delay": 2}) 
50+        threads.append(t) 
51+ 
52+    # Start each thread 
53+    for t in threads: 
54+        t.start() 
55+ 
56+    # Wait for all threads to finish 
57+    for t in threads: 
58+        t.join() 
59+ 
1460.. versionchanged :: 3.7 
1561   This module used to be optional, it is now always available.
1662
@@ -45,7 +91,25 @@ level :mod:`_thread` module.
4591   However, threading is still an appropriate model if you want to run
4692   multiple I/O-bound tasks simultaneously.
4793
48- .. include :: ../includes/wasm-notavail.rst 
94+ GIL and performance considerations
95+ ---------------------------------- 
96+ 
97+ Unlike the :mod: `multiprocessing ` module, which uses separate processes to
98+ bypass the :term: `global interpreter lock ` (GIL), the threading module operates
99+ within a single process, meaning that all threads share the same memory space.
100+ However, the GIL limits the performance gains of threading when it comes to
101+ CPU-bound tasks, as only one thread can execute Python bytecode at a time.
102+ Despite this, threads remain a useful tool for achieving concurrency in many
103+ scenarios.
104+ 
105+ As of Python 3.13, experimental :term: `free-threaded <free threading> ` builds
106+ can disable the GIL, enabling true parallel execution of threads, but this
107+ feature is not available by default (see :pep: `703 `).
108+ 
109+ ..  TODO: At some point this feature will become available by default.
110+ 
111+  Reference
112+ --------- 
49113
50114This module defines the following functions:
51115
@@ -62,7 +126,7 @@ This module defines the following functions:
62126
63127   Return the current :class: `Thread ` object, corresponding to the caller's thread
64128   of control.  If the caller's thread of control was not created through the
65-    :mod: `threading ` module, a dummy thread object with limited functionality is
129+    :mod: `! threading ` module, a dummy thread object with limited functionality is
66130   returned.
67131
68132   The function ``currentThread `` is a deprecated alias for this function.
@@ -157,13 +221,13 @@ This module defines the following functions:
157221
158222   .. index :: single: trace function 
159223
160-    Set a trace function for all threads started from the :mod: `threading ` module.
224+    Set a trace function for all threads started from the :mod: `! threading ` module.
161225   The *func * will be passed to  :func: `sys.settrace ` for each thread, before its
162226   :meth: `~Thread.run ` method is called.
163227
164228.. function :: settrace_all_threads(func) 
165229
166-    Set a trace function for all threads started from the :mod: `threading ` module
230+    Set a trace function for all threads started from the :mod: `! threading ` module
167231   and all Python threads that are currently executing.
168232
169233   The *func * will be passed to  :func: `sys.settrace ` for each thread, before its
@@ -186,13 +250,13 @@ This module defines the following functions:
186250
187251   .. index :: single: profile function 
188252
189-    Set a profile function for all threads started from the :mod: `threading ` module.
253+    Set a profile function for all threads started from the :mod: `! threading ` module.
190254   The *func * will be passed to  :func: `sys.setprofile ` for each thread, before its
191255   :meth: `~Thread.run ` method is called.
192256
193257.. function :: setprofile_all_threads(func) 
194258
195-    Set a profile function for all threads started from the :mod: `threading ` module
259+    Set a profile function for all threads started from the :mod: `! threading ` module
196260   and all Python threads that are currently executing.
197261
198262   The *func * will be passed to  :func: `sys.setprofile ` for each thread, before its
@@ -257,8 +321,8 @@ when implemented, are mapped to module-level functions.
257321All of the methods described below are executed atomically.
258322
259323
260- Thread-Local Data 
261- ----------------- 
324+ Thread-local data 
325+ ^^^^^^^^^^^^^^^^^ 
262326
263327Thread-local data is data whose values are thread specific. If you
264328have data that you want to be local to a thread, create a
@@ -389,8 +453,8 @@ affects what we see::
389453
390454.. _thread-objects :
391455
392- Thread Objects 
393- -------------- 
456+ Thread objects 
457+ ^^^^^^^^^^^^^^ 
394458
395459The :class: `Thread ` class represents an activity that is run in a separate
396460thread of control.  There are two ways to specify the activity: by passing a
@@ -645,8 +709,8 @@ since it is impossible to detect the termination of alien threads.
645709
646710.. _lock-objects :
647711
648- Lock Objects 
649- ------------ 
712+ Lock objects 
713+ ^^^^^^^^^^^^ 
650714
651715A primitive lock is a synchronization primitive that is not owned by a
652716particular thread when locked.  In Python, it is currently the lowest level
@@ -738,8 +802,8 @@ All methods are executed atomically.
738802
739803.. _rlock-objects :
740804
741- RLock Objects 
742- ------------- 
805+ RLock objects 
806+ ^^^^^^^^^^^^^ 
743807
744808A reentrant lock is a synchronization primitive that may be acquired multiple
745809times by the same thread.  Internally, it uses the concepts of "owning thread"
@@ -848,8 +912,8 @@ call release as many times the lock has been acquired can lead to deadlock.
848912
849913.. _condition-objects :
850914
851- Condition Objects 
852- ----------------- 
915+ Condition objects 
916+ ^^^^^^^^^^^^^^^^^ 
853917
854918A condition variable is always associated with some kind of lock; this can be
855919passed in or one will be created by default.  Passing one in is useful when
@@ -1026,8 +1090,8 @@ item to the buffer only needs to wake up one consumer thread.
10261090
10271091.. _semaphore-objects :
10281092
1029- Semaphore Objects 
1030- ----------------- 
1093+ Semaphore objects 
1094+ ^^^^^^^^^^^^^^^^^ 
10311095
10321096This is one of the oldest synchronization primitives in the history of computer
10331097science, invented by the early Dutch computer scientist Edsger W. Dijkstra (he
@@ -1107,7 +1171,7 @@ Semaphores also support the :ref:`context management protocol <with-locks>`.
11071171
11081172.. _semaphore-examples :
11091173
1110- :class: `Semaphore ` Example 
1174+ :class: `Semaphore ` example 
11111175^^^^^^^^^^^^^^^^^^^^^^^^^^ 
11121176
11131177Semaphores are often used to guard resources with limited capacity, for example,
@@ -1135,8 +1199,8 @@ causes the semaphore to be released more than it's acquired will go undetected.
11351199
11361200.. _event-objects :
11371201
1138- Event Objects 
1139- ------------- 
1202+ Event objects 
1203+ ^^^^^^^^^^^^^ 
11401204
11411205This is one of the simplest mechanisms for communication between threads: one
11421206thread signals an event and other threads wait for it.
@@ -1192,8 +1256,8 @@ method.  The :meth:`~Event.wait` method blocks until the flag is true.
11921256
11931257.. _timer-objects :
11941258
1195- Timer Objects 
1196- ------------- 
1259+ Timer objects 
1260+ ^^^^^^^^^^^^^ 
11971261
11981262This class represents an action that should be run only after a certain amount
11991263of time has passed --- a timer.  :class: `Timer ` is a subclass of :class: `Thread `
@@ -1230,8 +1294,8 @@ For example::
12301294      only work if the timer is still in its waiting stage.
12311295
12321296
1233- Barrier Objects 
1234- --------------- 
1297+ Barrier objects 
1298+ ^^^^^^^^^^^^^^^ 
12351299
12361300.. versionadded :: 3.2 
12371301
0 commit comments