Skip to content

Conversation

@kumaraditya303
Copy link
Contributor

@kumaraditya303kumaraditya303 commented Jan 15, 2025

@colesbury
Copy link
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
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
ContributorAuthor

@colesbury Added test based on the above code.

@kumaraditya303
Copy link
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]>

@kumaraditya303kumaraditya303 merged commit 8e0b360 into python:mainJan 24, 2025
40 checks passed
@kumaraditya303kumaraditya303 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