Skip to content

Commit

Permalink
Merge pull request #697 from shingo78/fix/run_sync-clean-up-pending-task
Browse files Browse the repository at this point in the history
Clean up the pending task
  • Loading branch information
Steven Silvester authored Sep 28, 2021
2 parents 5b2a485 + f84c8b4 commit 5b57015
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 1 deletion.
30 changes: 30 additions & 0 deletions jupyter_client/tests/test_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import asyncio
from unittest import mock

import pytest

from jupyter_client.utils import run_sync


@pytest.fixture
def loop():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
return loop


def test_run_sync_clean_up_task(loop):
async def coro_never_called():
pytest.fail("The call to this coroutine is not expected")

# Ensure that run_sync cancels the pending task
with mock.patch.object(loop, "run_until_complete") as patched_loop:
patched_loop.side_effect = KeyboardInterrupt
with mock.patch("asyncio.ensure_future") as patched_ensure_future:
mock_future = mock.Mock()
patched_ensure_future.return_value = mock_future
with pytest.raises(KeyboardInterrupt):
run_sync(coro_never_called)()
mock_future.cancel.assert_called_once()
# Suppress 'coroutine ... was never awaited' warning
patched_ensure_future.call_args[0][0].close()
7 changes: 6 additions & 1 deletion jupyter_client/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,12 @@ def wrapped(*args, **kwargs):
import nest_asyncio # type: ignore

nest_asyncio.apply(loop)
return loop.run_until_complete(coro(*args, **kwargs))
future = asyncio.ensure_future(coro(*args, **kwargs))
try:
return loop.run_until_complete(future)
except BaseException as e:
future.cancel()
raise e

wrapped.__doc__ = coro.__doc__
return wrapped
Expand Down

0 comments on commit 5b57015

Please sign in to comment.