Skip to content

Commit 0146aec

Browse files
Merge branch 'main' into fix-subinterp-thread-shutdown
2 parents a569355 + 2fd09b0 commit 0146aec

File tree

229 files changed

+3101
-1892
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

229 files changed

+3101
-1892
lines changed

.github/workflows/build.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,13 @@ permissions:
1515
contents: read
1616

1717
concurrency:
18-
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}-reusable
18+
# https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#concurrency
19+
# 'group' must be a key uniquely representing a PR or push event.
20+
# github.workflow is the workflow name
21+
# github.actor is the user invoking the workflow
22+
# github.head_ref is the source branch of the PR or otherwise blank
23+
# github.run_id is a unique number for the current run
24+
group: ${{ github.workflow }}-${{ github.actor }}-${{ github.head_ref || github.run_id }}
1925
cancel-in-progress: true
2026

2127
env:

Doc/howto/annotations.rst

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,4 +248,9 @@ quirks by using :func:`annotationlib.get_annotations` on Python 3.14+ or
248248
:func:`inspect.get_annotations` on Python 3.10+. On earlier versions of
249249
Python, you can avoid these bugs by accessing the annotations from the
250250
class's :attr:`~type.__dict__`
251-
(e.g., ``cls.__dict__.get('__annotations__', None)``).
251+
(for example, ``cls.__dict__.get('__annotations__', None)``).
252+
253+
In some versions of Python, instances of classes may have an ``__annotations__``
254+
attribute. However, this is not supported functionality. If you need the
255+
annotations of an instance, you can use :func:`type` to access its class
256+
(for example, ``annotationlib.get_annotations(type(myinstance))`` on Python 3.14+).

Doc/howto/free-threading-extensions.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ The wheels, shared libraries, and binaries are indicated by a ``t`` suffix.
396396
free-threaded build, with the ``t`` suffix, such as ``python3.13t``.
397397
* `pypa/cibuildwheel <https://github.com/pypa/cibuildwheel>`_ supports the
398398
free-threaded build if you set
399-
`CIBW_FREE_THREADED_SUPPORT <https://cibuildwheel.pypa.io/en/stable/options/#free-threaded-support>`_.
399+
`CIBW_ENABLE to cpython-freethreading <https://cibuildwheel.pypa.io/en/stable/options/#enable>`_.
400400

401401
Limited C API and Stable ABI
402402
............................

Doc/howto/free-threading-python.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ optionally support installing free-threaded Python binaries. The installers
3232
are available at https://www.python.org/downloads/.
3333

3434
For information on other platforms, see the `Installing a Free-Threaded Python
35-
<https://py-free-threading.github.io/installing_cpython/>`_, a
35+
<https://py-free-threading.github.io/installing-cpython/>`_, a
3636
community-maintained installation guide for installing free-threaded Python.
3737

3838
When building CPython from source, the :option:`--disable-gil` configure option

Doc/howto/isolating-extensions.rst

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,21 +215,36 @@ multiple interpreters correctly. If this is not yet the case for your
215215
module, you can explicitly make your module loadable only once per
216216
process. For example::
217217

218+
// A process-wide flag
218219
static int loaded = 0;
219220

221+
// Mutex to provide thread safety (only needed for free-threaded Python)
222+
static PyMutex modinit_mutex = {0};
223+
220224
static int
221225
exec_module(PyObject* module)
222226
{
227+
PyMutex_Lock(&modinit_mutex);
223228
if (loaded) {
229+
PyMutex_Unlock(&modinit_mutex);
224230
PyErr_SetString(PyExc_ImportError,
225231
"cannot load module more than once per process");
226232
return -1;
227233
}
228234
loaded = 1;
235+
PyMutex_Unlock(&modinit_mutex);
229236
// ... rest of initialization
230237
}
231238

232239

240+
If your module's :c:member:`PyModuleDef.m_clear` function is able to prepare
241+
for future re-initialization, it should clear the ``loaded`` flag.
242+
In this case, your module won't support multiple instances existing
243+
*concurrently*, but it will, for example, support being loaded after
244+
Python runtime shutdown (:c:func:`Py_FinalizeEx`) and re-initialization
245+
(:c:func:`Py_Initialize`).
246+
247+
233248
Module State Access from Functions
234249
----------------------------------
235250

Doc/library/asyncio-eventloop.rst

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ Creating Futures and Tasks
361361

362362
.. versionadded:: 3.5.2
363363

364-
.. method:: loop.create_task(coro, *, name=None, context=None, eager_start=None)
364+
.. method:: loop.create_task(coro, *, name=None, context=None, eager_start=None, **kwargs)
365365

366366
Schedule the execution of :ref:`coroutine <coroutine>` *coro*.
367367
Return a :class:`Task` object.
@@ -370,6 +370,10 @@ Creating Futures and Tasks
370370
for interoperability. In this case, the result type is a subclass
371371
of :class:`Task`.
372372

373+
The full function signature is largely the same as that of the
374+
:class:`Task` constructor (or factory) - all of the keyword arguments to
375+
this function are passed through to that interface.
376+
373377
If the *name* argument is provided and not ``None``, it is set as
374378
the name of the task using :meth:`Task.set_name`.
375379

@@ -388,8 +392,15 @@ Creating Futures and Tasks
388392
.. versionchanged:: 3.11
389393
Added the *context* parameter.
390394

395+
.. versionchanged:: 3.13.3
396+
Added ``kwargs`` which passes on arbitrary extra parameters, including ``name`` and ``context``.
397+
398+
.. versionchanged:: 3.13.4
399+
Rolled back the change that passes on *name* and *context* (if it is None),
400+
while still passing on other arbitrary keyword arguments (to avoid breaking backwards compatibility with 3.13.3).
401+
391402
.. versionchanged:: 3.14
392-
Added the *eager_start* parameter.
403+
All *kwargs* are now passed on. The *eager_start* parameter works with eager task factories.
393404

394405
.. method:: loop.set_task_factory(factory)
395406

@@ -402,6 +413,16 @@ Creating Futures and Tasks
402413
event loop, and *coro* is a coroutine object. The callable
403414
must pass on all *kwargs*, and return a :class:`asyncio.Task`-compatible object.
404415

416+
.. versionchanged:: 3.13.3
417+
Required that all *kwargs* are passed on to :class:`asyncio.Task`.
418+
419+
.. versionchanged:: 3.13.4
420+
*name* is no longer passed to task factories. *context* is no longer passed
421+
to task factories if it is ``None``.
422+
423+
.. versionchanged:: 3.14
424+
*name* and *context* are now unconditionally passed on to task factories again.
425+
405426
.. method:: loop.get_task_factory()
406427

407428
Return a task factory or ``None`` if the default one is in use.

Doc/library/asyncio-task.rst

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,18 +238,24 @@ Creating Tasks
238238

239239
-----------------------------------------------
240240

241-
.. function:: create_task(coro, *, name=None, context=None)
241+
.. function:: create_task(coro, *, name=None, context=None, eager_start=None, **kwargs)
242242

243243
Wrap the *coro* :ref:`coroutine <coroutine>` into a :class:`Task`
244244
and schedule its execution. Return the Task object.
245245

246-
If *name* is not ``None``, it is set as the name of the task using
247-
:meth:`Task.set_name`.
246+
The full function signature is largely the same as that of the
247+
:class:`Task` constructor (or factory) - all of the keyword arguments to
248+
this function are passed through to that interface.
248249

249250
An optional keyword-only *context* argument allows specifying a
250251
custom :class:`contextvars.Context` for the *coro* to run in.
251252
The current context copy is created when no *context* is provided.
252253

254+
An optional keyword-only *eager_start* argument allows specifying
255+
if the task should execute eagerly during the call to create_task,
256+
or be scheduled later. If *eager_start* is not passed the mode set
257+
by :meth:`loop.set_task_factory` will be used.
258+
253259
The task is executed in the loop returned by :func:`get_running_loop`,
254260
:exc:`RuntimeError` is raised if there is no running loop in
255261
current thread.
@@ -290,6 +296,9 @@ Creating Tasks
290296
.. versionchanged:: 3.11
291297
Added the *context* parameter.
292298

299+
.. versionchanged:: 3.14
300+
Added the *eager_start* parameter by passing on all *kwargs*.
301+
293302

294303
Task Cancellation
295304
=================
@@ -330,7 +339,7 @@ and reliable way to wait for all tasks in the group to finish.
330339

331340
.. versionadded:: 3.11
332341

333-
.. method:: create_task(coro, *, name=None, context=None)
342+
.. method:: create_task(coro, *, name=None, context=None, eager_start=None, **kwargs)
334343

335344
Create a task in this task group.
336345
The signature matches that of :func:`asyncio.create_task`.
@@ -342,6 +351,10 @@ and reliable way to wait for all tasks in the group to finish.
342351

343352
Close the given coroutine if the task group is not active.
344353

354+
.. versionchanged:: 3.14
355+
356+
Passes on all *kwargs* to :meth:`loop.create_task`
357+
345358
Example::
346359

347360
async def main():

Doc/library/hashlib.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ a file or file-like object.
284284
Example:
285285

286286
>>> import io, hashlib, hmac
287-
>>> with open(hashlib.__file__, "rb") as f:
287+
>>> with open("library/hashlib.rst", "rb") as f:
288288
... digest = hashlib.file_digest(f, "sha256")
289289
...
290290
>>> digest.hexdigest() # doctest: +ELLIPSIS

Doc/library/multiprocessing.rst

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,7 +1081,7 @@ Miscellaneous
10811081
.. function:: freeze_support()
10821082

10831083
Add support for when a program which uses :mod:`multiprocessing` has been
1084-
frozen to produce a Windows executable. (Has been tested with **py2exe**,
1084+
frozen to produce an executable. (Has been tested with **py2exe**,
10851085
**PyInstaller** and **cx_Freeze**.)
10861086

10871087
One needs to call this function straight after the ``if __name__ ==
@@ -1099,10 +1099,10 @@ Miscellaneous
10991099
If the ``freeze_support()`` line is omitted then trying to run the frozen
11001100
executable will raise :exc:`RuntimeError`.
11011101

1102-
Calling ``freeze_support()`` has no effect when invoked on any operating
1103-
system other than Windows. In addition, if the module is being run
1104-
normally by the Python interpreter on Windows (the program has not been
1105-
frozen), then ``freeze_support()`` has no effect.
1102+
Calling ``freeze_support()`` has no effect when the start method is not
1103+
*spawn*. In addition, if the module is being run normally by the Python
1104+
interpreter (the program has not been frozen), then ``freeze_support()``
1105+
has no effect.
11061106

11071107
.. function:: get_all_start_methods()
11081108

Doc/library/stdtypes.rst

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,8 +1788,14 @@ expression support in the :mod:`re` module).
17881788

17891789
Return centered in a string of length *width*. Padding is done using the
17901790
specified *fillchar* (default is an ASCII space). The original string is
1791-
returned if *width* is less than or equal to ``len(s)``.
1791+
returned if *width* is less than or equal to ``len(s)``. For example::
17921792

1793+
>>> 'Python'.center(10)
1794+
' Python '
1795+
>>> 'Python'.center(10, '-')
1796+
'--Python--'
1797+
>>> 'Python'.center(4)
1798+
'Python'
17931799

17941800

17951801
.. method:: str.count(sub[, start[, end]])
@@ -1799,8 +1805,18 @@ expression support in the :mod:`re` module).
17991805
interpreted as in slice notation.
18001806

18011807
If *sub* is empty, returns the number of empty strings between characters
1802-
which is the length of the string plus one.
1803-
1808+
which is the length of the string plus one. For example::
1809+
1810+
>>> 'spam, spam, spam'.count('spam')
1811+
3
1812+
>>> 'spam, spam, spam'.count('spam', 5)
1813+
2
1814+
>>> 'spam, spam, spam'.count('spam', 5, 10)
1815+
1
1816+
>>> 'spam, spam, spam'.count('eggs')
1817+
0
1818+
>>> 'spam, spam, spam'.count('')
1819+
17
18041820

18051821
.. method:: str.encode(encoding="utf-8", errors="strict")
18061822

0 commit comments

Comments
 (0)