Skip to content

gh-128002: use _PyObject_SetMaybeWeakref when creating tasks in asyncio - #128885

Merged
kumaraditya303 merged 5 commits into
python:mainfrom
kumaraditya303:maybe-weakref
Jan 24, 2025
Merged

gh-128002: use _PyObject_SetMaybeWeakref when creating tasks in asyncio#128885
kumaraditya303 merged 5 commits into
python:mainfrom
kumaraditya303:maybe-weakref

Conversation

@kumaraditya303

@kumaraditya303kumaraditya303 commented Jan 15, 2025

Copy link
Copy Markdown
Contributor

@colesbury

Copy link
Copy Markdown
Contributor

Can you add a test for this? I think something like the following would catch the bug:

  1. Create some tasks in the main thread
  2. Call all_tasks() in a different thread
  3. Check that you get all the tasks

@kumaraditya303

Copy link
Copy Markdown
ContributorAuthor

I think the following code appears to catch that bug:

importasyncioimportthreadingdeffunc():
loop=asyncio.EventLoop()
asyncdefcoro():
awaitasyncio.sleep(0.01)
lock=threading.Lock()
count=0asyncdefmain():
nonlocalcountwhileTrue:
withlock:
asyncio.create_task(coro())
count=len(asyncio.all_tasks(loop))
th=threading.Thread(target=loop.run_until_complete, args=(main(),))
th.start()
defcheck():
withlock:
assertcount==len(asyncio.all_tasks(loop))
threads= [threading.Thread(target=check) for_inrange(10)]
fortinthreads:
t.start()
fortinthreads:
t.join()
func()

Without the fix, I see many assertion errors and with it there isn't any.

@kumaraditya303

Copy link
Copy Markdown
ContributorAuthor

@colesbury Added test based on the above code.

@kumaraditya303

Copy link
Copy Markdown
ContributorAuthor

I have tweaked the test to be a little less strict when comparing, it still tests the bug.

Without fix:

./python -m test test_asyncio.test_free_threading -FUsing random seed: 29444251560:00:00 load avg: 0.61 Run tests sequentially in a single process0:00:00 load avg: 0.61 [ 1] test_asyncio.test_free_threadingWarning -- Uncaught thread exception: AssertionErrorException in thread Thread-5 (check):Warning -- Uncaught thread exception: AssertionErrorException in thread Thread-2 (check):Traceback (most recent call last):Traceback (most recent call last): File "/home/realkumaraditya/cpython/Lib/threading.py", line 1054, in _bootstrap_inner self.run() ~~~~~~~~^^ File "/home/realkumaraditya/cpython/Lib/threading.py", line 996, in run self._target(*self._args, **self._kwargs) ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/realkumaraditya/cpython/Lib/test/test_asyncio/test_free_threading.py", line 86, in check self.assertSetEqual(tasks & self.all_tasks(loop), tasks) ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/realkumaraditya/cpython/Lib/unittest/case.py", line 1176, in assertSetEqual self.fail(self._formatMessage(msg, standardMsg)) ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/realkumaraditya/cpython/Lib/unittest/case.py", line 741, in fail raise self.failureException(msg)AssertionError: Items in the second set but not the first:<Task pending name='Task-1' coro=<TestFreeThreading.test_all_tasks_different_thread.<locals>.main() running at /home/realkumaraditya/cpython/Lib/test/test_asyncio/test_free_threading.py:77> cb=[_run_until_complete_cb() at /home/realkumaraditya/cpython/Lib/asyncio/base_events.py:181]>

@kumaraditya303
kumaraditya303 merged commit 8e0b360 into python:mainJan 24, 2025
@kumaraditya303
kumaraditya303 deleted the maybe-weakref branch January 24, 2025 15:43
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@kumaraditya303@colesbury