Add async/await syntax to FULL_BUILD
This adds the `async def` and `await` verbs to valid CircuitPython syntax using the Micropython implementation. Consider: ``` >>> class Awaitable: ... def __iter__(self): ... for i in range(3): ... print('awaiting', i) ... yield ... return 42 ... >>> async def wait_for_it(): ... a = Awaitable() ... result = await a ... return result ... >>> task = wait_for_it() >>> next(task) awaiting 0 >>> next(task) awaiting 1 >>> next(task) awaiting 2 >>> next(task) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration: 42 >>> ``` and more excitingly: ``` >>> async def it_awaits_a_subtask(): ... value = await wait_for_it() ... print('twice as good', value * 2) ... >>> task = it_awaits_a_subtask() >>> next(task) awaiting 0 >>> next(task) awaiting 1 >>> next(task) awaiting 2 >>> next(task) twice as good 84 Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration: ``` Note that this is just syntax plumbing, not an all-encompassing implementation of an asynchronous task scheduler or asynchronous hardware apis. uasyncio might be a good module to bring in, or something else - but the standard Python syntax does not _strictly require_ deeper hardware support. Micropython implements the await verb via the __iter__ function rather than __await__. It's okay. The syntax being present will enable users to write clean and expressive multi-step state machines that are written serially and interleaved according to the rules provided by those users. Given that this does not include an all-encompassing C scheduler, this is expected to be an advanced functionality until the community settles on the future of deep hardware support for async/await in CircuitPython. Users will implement yield-based schedulers and tasks wrapping synchronous hardware APIs with polling to avoid blocking, while their application business logic gets simple `await` statements.
This commit is contained in:
parent
c7d87cea62
commit
d94d2d2975
|
@ -79,7 +79,6 @@
|
||||||
|
|
||||||
#define MICROPY_PY_ARRAY (1)
|
#define MICROPY_PY_ARRAY (1)
|
||||||
#define MICROPY_PY_ARRAY_SLICE_ASSIGN (1)
|
#define MICROPY_PY_ARRAY_SLICE_ASSIGN (1)
|
||||||
#define MICROPY_PY_ASYNC_AWAIT (0)
|
|
||||||
#define MICROPY_PY_ATTRTUPLE (1)
|
#define MICROPY_PY_ATTRTUPLE (1)
|
||||||
|
|
||||||
#define MICROPY_PY_BUILTINS_BYTEARRAY (1)
|
#define MICROPY_PY_BUILTINS_BYTEARRAY (1)
|
||||||
|
|
|
@ -290,3 +290,6 @@ CFLAGS += -DCIRCUITPY_WIFI=$(CIRCUITPY_WIFI)
|
||||||
# Enabled micropython.native decorator (experimental)
|
# Enabled micropython.native decorator (experimental)
|
||||||
CIRCUITPY_ENABLE_MPY_NATIVE ?= 0
|
CIRCUITPY_ENABLE_MPY_NATIVE ?= 0
|
||||||
CFLAGS += -DCIRCUITPY_ENABLE_MPY_NATIVE=$(CIRCUITPY_ENABLE_MPY_NATIVE)
|
CFLAGS += -DCIRCUITPY_ENABLE_MPY_NATIVE=$(CIRCUITPY_ENABLE_MPY_NATIVE)
|
||||||
|
|
||||||
|
# async/await language keyword support
|
||||||
|
MICROPY_PY_ASYNC_AWAIT ?= $(CIRCUITPY_FULL_BUILD)
|
||||||
|
|
Loading…
Reference in New Issue