Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
64b0129e
Commit
64b0129e
authored
Sep 30, 2013
by
Antoine Pitrou
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add a "skull and crossbones" to Py_AddPendingCall.
parent
7081cdf0
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
30 additions
and
25 deletions
+30
-25
Doc/c-api/init.rst
Doc/c-api/init.rst
+30
-25
No files found.
Doc/c-api/init.rst
View file @
64b0129e
...
...
@@ -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
--------------------------
...
...
@@ -905,41 +908,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.
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)
.. 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:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment