GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Sub interpreters by lelit · Pull Request #256 · python-rapidjson/python-rapidjson

Conversation

@lelit

@lelit lelit commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

This implements PEP-684, and thus issue #226.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
VestniK and others added 20 commits November 1, 2026 10:15
@VestniK @lelit
Turn rapidjson.Decoder into heap type
9706b40
Each static type is uniq and global for all subinterpreters and can't
access cached PyObjects. Decoder do use cached PyObjecs and must access
cache stored in module rather than in static variables.

Static type it can't access "proper module" due to its "per process
singleton nature". The recomended way is to turn static types into heap
types in order to use cached PyObjects.
@lelit
Properly release the stolen StrongRef
d8a3f83
See
#227 (review)
for an explanation.
@lelit
Simplify, assuming Python >= 3.10
c3c5581
@VestniK @lelit
Turn rapidjson.Encoder into heap type
e027049
@VestniK @lelit
Turn rapidjson.Validator into heap type
0e8c7c0
@VestniK @lelit
Turn rapidjson.RawJSON into heap type
7606903
@VestniK @lelit
Move PyObject caches into a single variable of struct type.
aa02572
This is a first step in the direction of subinterpreter compatibility.
Is's recommended to keep such caches in the module state rather then
process wide globals:

https://docs.python.org/3/howto/isolating-extensions.html#managing-per-module-state

Dedicated struct was created which can later on be stored in the module
state. It can't be done right now since those members are accessed from
static types initialization code which doesn't have access to the module.
Turning such static types into heap types is also subinterpreter
compatibility prerequisite:
https://docs.python.org/3/howto/isolating-extensions.html#heap-types
@VestniK @lelit
Reduce usage of cache global var by passing required parts as args
86e3fce
@VestniK @lelit
Enable subinterpreters on Python >= 3.12
2d6d650
@lelit
Attempt at replacing static data with module state
5475457
@lelit
Try with a anonymous namespace
d1836e9
@lelit
Adapt code introduced in PR #255
e797ed8
@lelit
Add missing INCREF on the rawjson reference in the state
0991cf3
@lelit
Fix access to the module's state from methods and slots
ee29bf5
@lelit
Move also the datetime API into the module's state
4a2fc18
I'm not really sure this is required, because AFAIU all the API is
actually static, and apparently shared by all interpreters... Anyway,
this seems clearer.
@lelit
Add some simple tests to exercize sub-interpreters
86a8ea8
@lelit
Add backward compatibility with Python 3.10
82b1453
@lelit
Fix refcount leak in the dealloc of RawJSON and Validator
d0bcde3
Both are heap types now: their instances hold a reference to the type and,
being GC-tracked, must be untracked before being freed. Their dealloc was
only calling tp_free(), leaking one reference to the type per instance and,
on debug interpreters, emitting a ResourceWarning.
@lelit
Drop support for Python 3.10
5a33e6b
Python 3.10 is EOL since 2026-10-01, and its not easy for me to even
test for it locally.

This also reverts commit 82b1453.
@lelit
Drop tox
cc85e9a
Its configuration still referenced Python 3.9 and 3.10, a good evidence
that it was abandoned lot of time ago.
@lelit

lelit commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

Ok, this is in good shape, as far as I can tell.
I decided to drop support for Python 3.10 (EOL since October 1st) because the attempt I made to cover it failed.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

No reviews

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

2 participants

@lelit @VestniK
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402520 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.