This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: [subinterpreters] Fix pending calls in subinterpreters
Type: Stage:
Components: Subinterpreters Versions: Python 3.9
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: eric.snow, vstinner
Priority: normal Keywords:

Created on 2020-04-08 21:33 by vstinner, last changed 2022-04-11 14:59 by admin.

Messages (2)
msg366010 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2020-04-08 21:33
Currently, _Py_ThreadCanHandlePendingCalls() only returns true if the current thread is the Python "main thread" (_PyRuntime.main_thread).

_PyRuntime.main_thread is initialized by _PyRuntime_Initialize().

The problem is that a subinterpreter can run a separated thread which may not be the "main thread".

As a consequence, a subinterpreter will not run schedulded pending calls, or it will run them later than it could.

I modified COMPUTE_EVAL_BREAKER() of ceval.c in bpo-40010: now if tstate->interp->ceval.pending.calls_to_do is true, tstate->interp->ceval.eval_breaker is only set to 1 if _Py_ThreadCanHandlePendingCalls() is true.

One option would be to allow any thread to run "pending calls".

Another option is to have one "main thread" per interpreter, rather than having a single "main thread" for all interpreters.


I made pending calls per-interpreter in bpo-39984.


In Python 3.7, main_thread variable came from _PyRutimeState.ceval.pending.main_thread. It was moved into _PyRuntimeState by this change:

commit 5be45a6105d656c551adeee7770afdc3b806fbb5
Author: Eric Snow <ericsnowcurrently@gmail.com>
Date:   Fri Mar 8 22:47:07 2019 -0700

    bpo-33608: Minor cleanup related to pending calls. (gh-12247)

--

_Py_ThreadCanHandleSignals() doesn't have to change: it must only return true for the main thread of the main interpreter. Currently, it's implemented as:

static inline int
_Py_ThreadCanHandleSignals(PyThreadState *tstate)
{
    return (_Py_IsMainThread() && _Py_IsMainInterpreter(tstate));
}
msg366014 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2020-04-08 21:38
I modified _PyEval_AddPendingCall() to accept interp rather than tstate to fix bpo-40082:

New changeset b54a99d6432de93de85be2b42a63774f8b4581a0 by Victor Stinner in branch 'master':
bpo-40082: trip_signal() uses the main interpreter (GH-19441)
https://github.com/python/cpython/commit/b54a99d6432de93de85be2b42a63774f8b4581a0
History
Date User Action Args
2022-04-11 14:59:29adminsetgithub: 84412
2020-05-15 00:39:53vstinnersetcomponents: + Subinterpreters, - Interpreter Core
title: Fix pending calls in subinterpreters -> [subinterpreters] Fix pending calls in subinterpreters
2020-04-08 21:38:04vstinnersetmessages: + msg366014
2020-04-08 21:33:25vstinnercreate