Skip to content

asyncio with two interpreter instances #91375

Description

@mbadaire
mannequin
BPO 47219
Nosy @asvetlov, @ericsnowcurrently, @1st1

Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

Show more details

GitHub fields:

assignee = None
closed_at = None
created_at = <Date 2022-04-04.19:57:08.003>
labels = ['type-bug', 'expert-asyncio']
title = 'asyncio with two interpreter instances'
updated_at = <Date 2022-04-04.20:38:00.422>
user = 'https://bugs.python.org/mbadaire'

bugs.python.org fields:

activity = <Date 2022-04-04.20:38:00.422>
actor = 'JelleZijlstra'
assignee = 'none'
closed = False
closed_date = None
closer = None
components = ['asyncio']
creation = <Date 2022-04-04.19:57:08.003>
creator = 'mbadaire'
dependencies = []
files = []
hgrepos = []
issue_num = 47219
keywords = []
message_count = 1.0
messages = ['416694']
nosy_count = 4.0
nosy_names = ['asvetlov', 'eric.snow', 'yselivanov', 'mbadaire']
pr_nums = []
priority = 'normal'
resolution = None
stage = None
status = 'open'
superseder = None
type = 'behavior'
url = 'https://bugs.python.org/issue47219'
versions = []

Activity

  1. mbadaire commented on Apr 4, 2022

    mbadairemannequin
    MannequinAuthor

    Hi,
    I have an issue when using asyncio and two interpreter instances each launched and used in a seperated thread.
    I am getting a asyncio loop for each thread .However asyncio is getting me the same loop because of this code in get_running_loop. Indeed when I have two interpreter, the ts_id would be the same for both my threads and therefore I will get the cached value of the first thread. cached_running_holder being static, it is the same value for all instances of interpreter.
    Maybe we should check if we are in the same interpreter or same thread ,.. I am not sure how it could be fixed.

    _asynciomodule.c:
    get_running_loop(PyObject **loop)
    {
        PyObject *rl;
    
        PyThreadState *ts = _PyThreadState_GET();
        uint64_t ts_id = PyThreadState_GetID(ts);
        if (ts_id == cached_running_holder_tsid && cached_running_holder != NULL) {

    If it does not make sense, I have some sample code but it is not just 10 lines.

  2. transferred this issue fromon Apr 10, 2022
  3. pipiche38 commented on May 6, 2022

    @pipiche38

    hello, is there anything we can do to get some attention ?
    This is a blocking issue in our project which spawn several instances from a Python embedded framework

    Thanks in advance

  4. ericsnowcurrently commented on May 6, 2022

    @ericsnowcurrently
    Member

    It looks like asyncio has not been updated to support use in multiple interpreters -- the module uses a whole bunch of global variables to store state. Until that is dealt with, asyncio cannot be used reliably with multiple interpreters. See PEP 687. @erlend-aasland

    Also note that this is unlikely to be considered a bug, so no backports. Likewise it is unlikely to happen for 3.11 since the feature freeze is literally today. Thus the soonest you may see a fix is 3.12 (Fall 2023), unfortunately.

  5. erlend-aasland commented on May 7, 2022

    @erlend-aasland
    Contributor

    Yeah, as soon as PEP 687 land, we can start the process of implementing this. I believe I've got a WIP branch lying around already.

  6. pipiche38 commented on May 7, 2022

    @pipiche38

    Thanks for the update, we will be patient. just a shame not to have back port, but understood the amount of work.
    Now, we would be really please to test it when you want .

    Potential testing platforms OS: raspian or fedora

  7. erlend-aasland commented on May 7, 2022

    @erlend-aasland
    Contributor

    I can push it to my fork next week, so you can play with it.

  8. kumaraditya303 commented on May 24, 2022

    @kumaraditya303
    Contributor

    One workaround currently is to not use _asyncio speed up module but to use pure python version as that does not has this limitation.

  9. pipiche38 commented on May 24, 2022

    @pipiche38

    One workaround currently is to not use _asyncio speed up module but to use pure python version as that does not has this limitation.

    interesting. How to you prevent using _asyncio ?

  10. kumaraditya303 commented on May 24, 2022

    @kumaraditya303
    Contributor

    Before importing asyncio add this line:

    import sys
    sys.modules["_asyncio"] = None
  11. pipiche38 commented on May 24, 2022

    @pipiche38

    @kumaraditya303 if ayncio is imported in many module. does it enough to do it only once while importing asyncio for the first time ?

    [edit] at least I did it prior the first occurence of import and this looks pretty good .

  12. 24 remaining items

  13. Repository owner moved this from In Progress to Done in Subinterpreterson Nov 29, 2022
  14. Repository owner moved this from In Progress to Done in asyncioon Nov 29, 2022
  15. ericsnowcurrently commented on Nov 29, 2022

    @ericsnowcurrently
    Member

    Thanks for working on this, @kumaraditya303!

  16. erlend-aasland commented on Jan 23, 2023

    @erlend-aasland
    Contributor

    Reopening: the future iter object freelist is still a static global, and we forgot to clean up Tools/c-analyzer/cpython/globals-to-fix.tsv.

  17. moved this from Done to In Progress in asyncioon Jan 23, 2023
  18. added a commit that references this issue on Jan 23, 2023
  19. kumaraditya303 commented on Jan 24, 2023

    @kumaraditya303
    Contributor

    Reopening: the future iter object freelist is still a static global, and we forgot to clean up Tools/c-analyzer/cpython/globals-to-fix.tsv.

    I left that freelist intentionally as it is not an issue until we have per interpreter GIL. @markshannon has ideas for a global better freelist so hopefully we should be able to remove this freelist entirely.

  20. erlend-aasland commented on Jan 24, 2023

    @erlend-aasland
    Contributor

    I left that freelist intentionally as it is not an issue until we have per interpreter GIL. @markshannon has ideas for a global better freelist so hopefully we should be able to remove this freelist entirely.

    I see, thanks for the heads-up.

  21. added a commit that references this issue on Jan 24, 2023
  22. added a commit that references this issue on Jan 24, 2023
  23. moved this from In Progress to Done in asyncioon Jan 24, 2023
  24. gvanrossum commented on Jan 24, 2023

    @gvanrossum
    Member

    I left that freelist intentionally as it is not an issue until we have per interpreter GIL. @markshannon has ideas for a global better freelist so hopefully we should be able to remove this freelist entirely.

    Hm. I wouldn't necessarily count on Mark's single freelist idea to be implemented before we get a per-subinterpreter GIL (esp. since the work on mimalloc seems stalled, alas -- Christian Heimes seems to be occupied by other things).

    So I think it would behoove us to move fi_freelist and fi_freelist_len to the "per runtime" structure? Or what am I missing?

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

Metadata

Metadata

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions