summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2020-04-09 13:15:47 +1000
committerDamien George <damien.p.george@gmail.com>2020-04-13 22:16:52 +1000
commitdb137e70dcf67de26828e17c2d3dc9d21e971eb0 (patch)
treeb6e5e8cd0b2f63ed169379a33c3021c156008148
parent1bbc15dd15b232f833b6cc2066bd9ca2b7fe6b66 (diff)
downloadmicropython-db137e70dcf67de26828e17c2d3dc9d21e971eb0.tar.gz
micropython-db137e70dcf67de26828e17c2d3dc9d21e971eb0.zip
extmod/uasyncio: Add Loop.new_event_loop method.
This commit adds Loop.new_event_loop() which is used to reset the singleton event loop. This functionality is put here instead of in Loop.close() to make it possible to write code that is compatible with CPython.
-rw-r--r--docs/library/uasyncio.rst7
-rw-r--r--extmod/uasyncio/core.py20
-rw-r--r--tests/extmod/uasyncio_new_event_loop.py36
-rw-r--r--tests/extmod/uasyncio_new_event_loop.py.exp6
4 files changed, 62 insertions, 7 deletions
diff --git a/docs/library/uasyncio.rst b/docs/library/uasyncio.rst
index 9cb0ca9bb9..0f363a076e 100644
--- a/docs/library/uasyncio.rst
+++ b/docs/library/uasyncio.rst
@@ -244,6 +244,13 @@ Event Loop
Return the event loop used to schedule and run tasks. See `Loop`.
+.. function:: new_event_loop()
+
+ Reset the event loop and return it.
+
+ Note: since MicroPython only has a single event loop this function just
+ resets the loop's state, it does not create a new one.
+
.. class:: Loop()
This represents the object which schedules and runs tasks. It cannot be
diff --git a/extmod/uasyncio/core.py b/extmod/uasyncio/core.py
index e2f64119c5..689487d36a 100644
--- a/extmod/uasyncio/core.py
+++ b/extmod/uasyncio/core.py
@@ -132,13 +132,6 @@ class IOQueue:
################################################################################
# Main run loop
-# TaskQueue of Task instances
-_task_queue = TaskQueue()
-
-# Task queue and poller for stream IO
-_io_queue = IOQueue()
-
-
# Ensure the awaitable is a task
def _promote_to_task(aw):
return aw if isinstance(aw, Task) else create_task(aw)
@@ -269,3 +262,16 @@ class Loop:
# The runq_len and waitq_len arguments are for legacy uasyncio compatibility
def get_event_loop(runq_len=0, waitq_len=0):
return Loop
+
+
+def new_event_loop():
+ global _task_queue, _io_queue
+ # TaskQueue of Task instances
+ _task_queue = TaskQueue()
+ # Task queue and poller for stream IO
+ _io_queue = IOQueue()
+ return Loop
+
+
+# Initialise default event loop
+new_event_loop()
diff --git a/tests/extmod/uasyncio_new_event_loop.py b/tests/extmod/uasyncio_new_event_loop.py
new file mode 100644
index 0000000000..b711befba9
--- /dev/null
+++ b/tests/extmod/uasyncio_new_event_loop.py
@@ -0,0 +1,36 @@
+# Test Loop.new_event_loop()
+
+try:
+ import uasyncio as asyncio
+except ImportError:
+ try:
+ import asyncio
+ except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+
+async def task():
+ for i in range(4):
+ print("task", i)
+ await asyncio.sleep(0)
+ await asyncio.sleep(0)
+
+
+async def main():
+ print("start")
+ loop.create_task(task())
+ await asyncio.sleep(0)
+ print("stop")
+ loop.stop()
+
+
+# Use default event loop to run some tasks
+loop = asyncio.get_event_loop()
+loop.create_task(main())
+loop.run_forever()
+
+# Create new event loop, old one should not keep running
+loop = asyncio.new_event_loop()
+loop.create_task(main())
+loop.run_forever()
diff --git a/tests/extmod/uasyncio_new_event_loop.py.exp b/tests/extmod/uasyncio_new_event_loop.py.exp
new file mode 100644
index 0000000000..9e104fda39
--- /dev/null
+++ b/tests/extmod/uasyncio_new_event_loop.py.exp
@@ -0,0 +1,6 @@
+start
+task 0
+stop
+start
+task 0
+stop