summaryrefslogtreecommitdiff
path: root/Doc/c-api/init.rst
diff options
context:
space:
mode:
Diffstat (limited to 'Doc/c-api/init.rst')
-rw-r--r--Doc/c-api/init.rst58
1 files changed, 32 insertions, 26 deletions
diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst
index 7507e3b52d..4dad2c814d 100644
--- a/Doc/c-api/init.rst
+++ b/Doc/c-api/init.rst
@@ -442,6 +442,9 @@ pointer.
standard :mod:`zlib` and :mod:`hashlib` modules release the GIL when
compressing or hashing data.
+
+.. _gilstate:
+
Non-Python created threads
--------------------------
@@ -545,6 +548,7 @@ code, or when embedding the Python interpreter:
.. index:: module: _thread
.. note::
+
When only the main thread exists, no GIL operations are needed. This is a
common situation (most Python programs do not use threads), and the lock
operations slow the interpreter down a bit. Therefore, the lock is not
@@ -646,7 +650,7 @@ with sub-interpreters:
:c:func:`PyGILState_Release` on the same thread.
-.. c:function:: PyThreadState PyGILState_GetThisThreadState()
+.. c:function:: PyThreadState* PyGILState_GetThisThreadState()
Get the current thread state for this thread. May return ``NULL`` if no
GILState API has been used on the current thread. Note that the main thread
@@ -905,41 +909,43 @@ Asynchronous Notifications
A mechanism is provided to make asynchronous notifications to the main
interpreter thread. These notifications take the form of a function
-pointer and a void argument.
-
-.. index:: single: setcheckinterval() (in module sys)
+pointer and a void pointer argument.
-Every check interval, when the global interpreter lock is released and
-reacquired, Python will also call any such provided functions. This can be used
-for example by asynchronous IO handlers. The notification can be scheduled from
-a worker thread and the actual call than made at the earliest convenience by the
-main thread where it has possession of the global interpreter lock and can
-perform any Python API calls.
.. c:function:: int Py_AddPendingCall(int (*func)(void *), void *arg)
.. index:: single: Py_AddPendingCall()
- Post a notification to the Python main thread. If successful, *func* will be
- called with the argument *arg* at the earliest convenience. *func* will be
- called having the global interpreter lock held and can thus use the full
- Python API and can take any action such as setting object attributes to
- signal IO completion. It must return 0 on success, or -1 signalling an
- exception. The notification function won't be interrupted to perform another
- asynchronous notification recursively, but it can still be interrupted to
- switch threads if the global interpreter lock is released, for example, if it
- calls back into Python code.
+ Schedule a function to be called from the main interpreter thread. On
+ success, 0 is returned and *func* is queued for being called in the
+ main thread. On failure, -1 is returned without setting any exception.
- This function returns 0 on success in which case the notification has been
- scheduled. Otherwise, for example if the notification buffer is full, it
- returns -1 without setting any exception.
+ When successfully queued, *func* will be *eventually* called from the
+ main interpreter thread with the argument *arg*. It will be called
+ asynchronously with respect to normally running Python code, but with
+ both these conditions met:
- This function can be called on any thread, be it a Python thread or some
- other system thread. If it is a Python thread, it doesn't matter if it holds
- the global interpreter lock or not.
+ * on a :term:`bytecode` boundary;
+ * with the main thread holding the :term:`global interpreter lock`
+ (*func* can therefore use the full C API).
- .. versionadded:: 3.1
+ *func* must return 0 on success, or -1 on failure with an exception
+ set. *func* won't be interrupted to perform another asynchronous
+ notification recursively, but it can still be interrupted to switch
+ threads if the global interpreter lock is released.
+
+ This function doesn't need a current thread state to run, and it doesn't
+ need the global interpreter lock.
+ .. warning::
+ This is a low-level function, only useful for very special cases.
+ There is no guarantee that *func* will be called as quick as
+ possible. If the main thread is busy executing a system call,
+ *func* won't be called before the system call returns. This
+ function is generally **not** suitable for calling Python code from
+ arbitrary C threads. Instead, use the :ref:`PyGILState API<gilstate>`.
+
+ .. versionadded:: 3.1
.. _profiling: