From 82fadab64f3b70c26f7900771bc9de5c6581a6bd Mon Sep 17 00:00:00 2001 From: Tony Zedginidze Date: Tue, 13 Oct 2026 11:55:18 +0200 Subject: [PATCH] docs: illustrate nursery.start service readiness --- .../_static/nursery-start-readiness.png | Bin 0 -> 30669 bytes .../_static/nursery-start-readiness.svg | 98 ++++++++++++++++++ docs/source/reference-core.rst | 28 +++++ newsfragments/3540.doc.rst | 1 + 4 files changed, 127 insertions(+) create mode 100644 docs/source/_static/nursery-start-readiness.png create mode 100644 docs/source/_static/nursery-start-readiness.svg create mode 100644 newsfragments/3540.doc.rst diff --git a/docs/source/_static/nursery-start-readiness.png b/docs/source/_static/nursery-start-readiness.png new file mode 100644 index 0000000000000000000000000000000000000000..e74d341c2263327a61482a4b2d821aaea30ea648 GIT binary patch literal 30669 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 b>K5;DNMmg069Q#03y9P!Ie3w{{>T3VJm~E^ literal 0 HcmV?d00001 diff --git a/docs/source/_static/nursery-start-readiness.svg b/docs/source/_static/nursery-start-readiness.svg new file mode 100644 index 000000000..5ccea2605 --- /dev/null +++ b/docs/source/_static/nursery-start-readiness.svg @@ -0,0 +1,98 @@ + +Embedded inter font subsets retain the following copyright and SIL OFL 1.1 license. The surrounding diagram retains its repository license. + +Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) Inter-Italic[opsz,wght].ttf: Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +Trio service startup readiness handshake with nursery.startThe parent awaits nursery.start for a trio.serve_tcp child. The child binds listening sockets, then calls task_status.started(listeners). Only then does the parent receive the listeners and connect to a returned port. The child continues serving after the readiness signal.await nursery.start(serve)Bind and listenListening sockets readystarted(listeners)Connect to returned portTCP connection establishedParent taskWaits for started()Service child taskRuns trio.serve_tcpListening socketBound and listening diff --git a/docs/source/reference-core.rst b/docs/source/reference-core.rst index ee4468ce6..36a13bf0a 100644 --- a/docs/source/reference-core.rst +++ b/docs/source/reference-core.rst @@ -1022,6 +1022,34 @@ The nursery API .. automethod:: start_soon(async_fn, *args, name = None) +Service startup readiness ++++++++++++++++++++++++++ + +:meth:`Nursery.start` waits for a readiness signal, rather than merely scheduling +another task or waiting for that task to finish. For example, +:func:`serve_tcp` binds its listening sockets before it signals +``task_status.started(listeners)``. The awaiting parent receives those listeners +and can connect to their bound ports, while the service task continues running. + +.. figure:: _static/nursery-start-readiness.png + :alt: The parent awaits nursery.start for a serve_tcp child. The child binds listening sockets and signals started(listeners). The parent then receives the listeners and connects to a returned port. The service continues running after signaling readiness. + :width: 760px + + Successful TCP service startup. :download:`Editable SVG <_static/nursery-start-readiness.svg>`. + `Edit diagram `__. + +The child's code defines what "ready" means. A call to ``started()`` is not a +promise that the service has finished, nor that every application-level handler +has already run. In this example it tells the parent that listening sockets are +available. By contrast, :meth:`Nursery.start_soon` returns without waiting for +this handshake. + +If the child raises before signaling readiness, that exception is reported by +the awaiting ``start`` call. If it exits normally without calling ``started()``, +``start`` raises :class:`RuntimeError`. Cancelling ``start`` during startup also +cancels the child. After the signal, the child belongs to the nursery and its +subsequent errors follow the nursery's usual exception handling. + .. attribute:: TASK_STATUS_IGNORED :type: TaskStatus diff --git a/newsfragments/3540.doc.rst b/newsfragments/3540.doc.rst new file mode 100644 index 000000000..27c409b84 --- /dev/null +++ b/newsfragments/3540.doc.rst @@ -0,0 +1 @@ +Added a service startup readiness diagram and explanation for ``Nursery.start``.