Skip to content

Async pubsub burns CPU by default. #3208

Open
@judilsteve

Description

@judilsteve

Version: redis-py 5.0.3, redis 7.0.12

Platform: Python 3.12 on Linux

Description:

In redis-py's asyncio pubsub get_message() function, the timeout kwarg defaults to 0, which means the function by default returns immediately if there is no message available. So if one were to blindly follow the example code, which essentially amounts to:

while True:
    message = await pubsub.get_message()
    if message:
        # Deal with message...  

They will find that the thread running this example code is pegged at 100% usage, constantly burning through that tight loop. To get the behaviour that a sane person would expect (yielding to the event loop until the message is available), they need to explicitly set timeout=None.

This is a terrible default value which resulted in me spending an entire afternoon trying to figure out why my server was pinned at 100% CPU usage, even though there were zero messages going through the pubsub channel. I have since changed my code to use timeout=None, but I really think this should be the default, especially when using the async version of the client (I have not checked to see if the same footgun applies to the synchronous API).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions