Commit 64b0129e authored by Antoine Pitrou's avatar Antoine Pitrou

Add a "skull and crossbones" to Py_AddPendingCall.

parent 7081cdf0
...@@ -442,6 +442,9 @@ pointer. ...@@ -442,6 +442,9 @@ pointer.
standard :mod:`zlib` and :mod:`hashlib` modules release the GIL when standard :mod:`zlib` and :mod:`hashlib` modules release the GIL when
compressing or hashing data. compressing or hashing data.
.. _gilstate:
Non-Python created threads Non-Python created threads
-------------------------- --------------------------
...@@ -905,41 +908,43 @@ Asynchronous Notifications ...@@ -905,41 +908,43 @@ Asynchronous Notifications
A mechanism is provided to make asynchronous notifications to the main A mechanism is provided to make asynchronous notifications to the main
interpreter thread. These notifications take the form of a function interpreter thread. These notifications take the form of a function
pointer and a void argument. pointer and a void pointer argument.
.. index:: single: setcheckinterval() (in module sys)
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) .. c:function:: int Py_AddPendingCall(int (*func)(void *), void *arg)
.. index:: single: Py_AddPendingCall() .. index:: single: Py_AddPendingCall()
Post a notification to the Python main thread. If successful, *func* will be Schedule a function to be called from the main interpreter thread. On
called with the argument *arg* at the earliest convenience. *func* will be success, 0 is returned and *func* is queued for being called in the
called having the global interpreter lock held and can thus use the full main thread. On failure, -1 is returned without setting any exception.
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.
This function returns 0 on success in which case the notification has been When successfully queued, *func* will be *eventually* called from the
scheduled. Otherwise, for example if the notification buffer is full, it main interpreter thread with the argument *arg*. It will be called
returns -1 without setting any exception. 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 * on a :term:`bytecode` boundary;
other system thread. If it is a Python thread, it doesn't matter if it holds * with the main thread holding the :term:`global interpreter lock`
the global interpreter lock or not. (*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: .. _profiling:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment