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
@@ -608,8 +672,8 @@ since it is impossible to detect the termination of alien threads.
608672
609673.. _lock-objects :
610674
611- Lock Objects
612- ------------
675+ Lock objects
676+ ^^^^^^^^^^^^
613677
614678A primitive lock is a synchronization primitive that is not owned by a
615679particular thread when locked. In Python, it is currently the lowest level
@@ -698,8 +762,8 @@ All methods are executed atomically.
698762
699763.. _rlock-objects :
700764
701- RLock Objects
702- -------------
765+ RLock objects
766+ ^^^^^^^^^^^^^
703767
704768A reentrant lock is a synchronization primitive that may be acquired multiple
705769times by the same thread. Internally, it uses the concepts of "owning thread"
@@ -801,8 +865,8 @@ call release as many times the lock has been acquired can lead to deadlock.
801865
802866.. _condition-objects :
803867
804- Condition Objects
805- -----------------
868+ Condition objects
869+ ^^^^^^^^^^^^^^^^^
806870
807871A condition variable is always associated with some kind of lock; this can be
808872passed in or one will be created by default. Passing one in is useful when
@@ -973,8 +1037,8 @@ item to the buffer only needs to wake up one consumer thread.
9731037
9741038.. _semaphore-objects :
9751039
976- Semaphore Objects
977- -----------------
1040+ Semaphore objects
1041+ ^^^^^^^^^^^^^^^^^
9781042
9791043This is one of the oldest synchronization primitives in the history of computer
9801044science, invented by the early Dutch computer scientist Edsger W. Dijkstra (he
@@ -1054,7 +1118,7 @@ Semaphores also support the :ref:`context management protocol <with-locks>`.
10541118
10551119.. _semaphore-examples :
10561120
1057- :class: `Semaphore ` Example
1121+ :class: `Semaphore ` example
10581122^^^^^^^^^^^^^^^^^^^^^^^^^^
10591123
10601124Semaphores are often used to guard resources with limited capacity, for example,
@@ -1082,8 +1146,8 @@ causes the semaphore to be released more than it's acquired will go undetected.
10821146
10831147.. _event-objects :
10841148
1085- Event Objects
1086- -------------
1149+ Event objects
1150+ ^^^^^^^^^^^^^
10871151
10881152This is one of the simplest mechanisms for communication between threads: one
10891153thread signals an event and other threads wait for it.
@@ -1139,8 +1203,8 @@ method. The :meth:`~Event.wait` method blocks until the flag is true.
11391203
11401204.. _timer-objects :
11411205
1142- Timer Objects
1143- -------------
1206+ Timer objects
1207+ ^^^^^^^^^^^^^
11441208
11451209This class represents an action that should be run only after a certain amount
11461210of time has passed --- a timer. :class: `Timer ` is a subclass of :class: `Thread `
@@ -1177,8 +1241,8 @@ For example::
11771241 only work if the timer is still in its waiting stage.
11781242
11791243
1180- Barrier Objects
1181- ---------------
1244+ Barrier objects
1245+ ^^^^^^^^^^^^^^^
11821246
11831247.. versionadded :: 3.2
11841248
0 commit comments