Skip to content

test_asynciotest_to_thread_concurrent flaky#122957

@colesbury

Description

@colesbury

The call_count counter on mock.Mock is not atomic, so updates may be lost:

asyncdeftest_to_thread_concurrent(self):
func=mock.Mock()
futs= []
for_inrange(10):
fut=asyncio.to_thread(func)
futs.append(fut)
awaitasyncio.gather(*futs)
self.assertEqual(func.call_count, 10)

This leads to occasional errors like:

File "Lib/test/test_asyncio/test_threads.py", line 41, in test_to_thread_concurrent self.assertEqual(func.call_count, 10) ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ AssertionError: 9 != 10 

I think the update is not actually atomic even with the GIL because of the use of _delegating_property in Mock, but I'm not entirely sure. The failures are definitely more likely to occur in the free-threaded build.

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions