36. Coroutine và Async

Coroutine là các phép tính có thể tiếp tục được sử dụng cho lập trình không đồng bộ. Họ để mã Python tạm dừng ở mứcawaitđiểm, đưa điều khiển trở lại vòng lặp sự kiện và sau đó tiếp tục lại khi thao tác được chờ đợi có kết quả.

Một coroutine tương tự như một trình tạo vì cả hai đều duy trì trạng thái thực thi trong suốt quá trình tạm ngưng. Sự khác biệt là giao thức và mục đích.

Trình tạo mang lại giá trị cho người tiêu dùng vòng lặp.

Một coroutine chờ các hoạt động không đồng bộ khác và cuối cùng trả về một kết quả cuối cùng.python id="o2u8bi" async def fetch(): data = await read() return data Đang gọifetch()không chạy cơ thể để hoàn thành. Nó tạo ra một đối tượng coroutine.```python id="9i5ai1" coro = fetch()


## 36.1 Hàm Coroutine vs Đối tượng Coroutine

Mt`async def`câu lnh to ra mt hàm coroutine.

Vic gi hàm coroutine s to ra mt đối tượng coroutine.```python id="rt8ky9"
async def work():
    return 42

coro = work()
```V mt khái nim:```text id="q71j65"
work
    coroutine function object

work()
    coroutine object
        suspended execution state
        code object
        frame or frame-like state
```Điu này khác vi mt chc năng thông thường:```python id="nv1t8j"
def work():
    return 42

work()
```Mt lnh gi hàm thông thường s chy ngay lp tc và tr v`42`.

Lnh gi hàm không đồng b tr v mt đối tượng coroutine mà sau này phi được điu khin.

## 36,2`await`

`await`tm dng coroutine hin ti cho đến khi mt coroutine khác có th ch đợi hoàn tt.```python id="wjue72"
async def outer():
    value = await inner()
    return value + 1
```Biu thc:```python id="pbwts5"
await inner()
```thc hin mt s điu v mt khái nim:```text id="n2ycfi"
call inner()
obtain awaitable object
suspend current coroutine
let event loop drive awaitable
resume current coroutine with result
```Nếu hot động được ch đợi tăng lên, ngoi l s được đưa tr li vào coroutine đang ch.```python id="yc56f3"
async def outer():
    try:
        value = await inner()
    except ValueError:
        value = 0
    return value
```## 36.3 Đang chờ`await`hoạt động trên các đối tượng được chờ đợi.

Nhng th được ch đợi ph biến bao gm:```text id="o2vwvk"
coroutine objects
asyncio Task objects
asyncio Future objects
objects implementing __await__
```Mt đối tượng tùy chnh có th được ch đợi bng cách xác định`__await__`.

```python id="f4sd9q"
class Immediate:
    def __await__(self):
        yield
        return 42
```Trong thc tế, hu hết mã ng dng đều ch coroutine, nhim v và tương lai được to bi khung không đồng b.

## 36.4 Trạng thái coroutine

Mt coroutine có th  các trng thái tương t như trng thái ca trình to:```text id="qcur3i"
created
running
suspended
closed
```S dng`inspect`:

```python id="84zov8"
import inspect

async def work():
    await other()

coro = work()
print(inspect.getcoroutinestate(coro))
```Các trng thái ph biến bao gm:```text id="h0yb3u"
CORO_CREATED
CORO_RUNNING
CORO_SUSPENDED
CORO_CLOSED
```Nhiu người tiêu dùng không th ch đợi mt coroutine cùng mt lúc. Nó đại din cho mt ln thc hin.

## 36.5 Khung Coroutine

Mt coroutine b đình ch s gi trng thái thc thi ca nó.

Trng thái đó bao gm:```text id="o61wj7"
code object
instruction position
local variables
value stack
exception state
currently awaited object
running state
closed state
```Ví d:```python id="1tow3u"
async def process():
    data = await read()
    return transform(data)
```Trong khi b đình ch ti`await read()`, coroutine phi nh:```text id="985lzm"
current frame
local variables
await target
next instruction after await
```Khi`read()`hoàn tt, coroutine s tiếp tc và gán giá tr tr v cho`data`.

## 36.6 Coroutine sử dụng cùng một Frame Model

Coroutine không s dng trình thông dch riêng. Chúng được thc thi bi cùng mt vòng đánh giá CPython.

Vòng lp chy cho đến coroutine:```text id="p7w1wv"
awaits and suspends
returns
raises
is cancelled
```V mt khái nim:```text id="xzr16h"
coroutine object
    frame state
        bytecode
        stack
        locals

event loop
    resumes coroutine
        evaluation loop runs frame
        stops at await or completion
```Vòng lp s kin thc hin lp lch trình. CPython cung cp b máy thc thi có th tiếp tc.

## 36.7 Vòng lặp sự kiện

Vòng lp s kin điu phi các tác v không đồng b.

TRONG`asyncio`, vòng lp s kin qun lý:```text id="n7xdfh"
ready tasks
sleep timers
socket readiness
future completion
callbacks
cancellation
exception reporting
```Ví d:```python id="0chlb7"
import asyncio

async def main():
    await asyncio.sleep(1)
    return 42

result = asyncio.run(main())
print(result)

asyncio.runtạo và điều khiển một vòng lặp sự kiện cho đến khimain()hoàn thành.

Bản thân CPython cung cấp các đối tượng coroutine vàawaitngữ nghĩa.asynciocung cấp một triển khai vòng lặp sự kiện tiêu chuẩn.

36.8 Nhiệm vụ

Riêng đối tượng coroutine là thụ động. Một tác vụ lên lịch cho nó thực hiện.```python id="8et1tq" import asyncio

async def work(): await asyncio.sleep(1) return 42

async def main(): task = asyncio.create_task(work()) result = await task return result Về mặt khái niệm:text id="p93t67" coroutine object passive resumable computation

task event-loop managed wrapper resumes coroutine stores result or exception supports cancellation


## 36.9 Hợp tác đồng thời

Async Python s dng đồng thi hp tác.

Mt coroutine chy cho đến khi đạt đến đim ch.```python id="8ux1ur"
async def work():
    step1()
    await wait()
    step2()
```Trong lúc`step1()`, không có tác v nào khác chy trên vòng lp s kin đó tr khi`step1()`chính nó đang ch hoc tr li quyn điu khin.

Ti`await wait()`, coroutine tm dng và vòng lp s kin có th chy mt tác v khác.

Điu này có nghĩa là mã nng CPU bên trong coroutine có th chn vòng lp s kin:```python id="g8fwp9"
async def bad():
    while True:
        compute()
```Không có`await`, coroutine này không mang li quyn kim soát.

## 36.10 Async không phải là tính song song

Đồng thi không đồng b không t động có nghĩa là song song CPU.

Mt vòng lp s kin thường chy trong mt lung h điu hành. Nó ch chuyn đổi gia các nhim v ti các đim treo.

Async hot động tt cho:```text id="oell4m"
network I/O
many open connections
timeouts
sleeping
waiting for subprocesses
streaming protocols
cooperative task orchestration
```Nó không làm cho mã byte Python gn vi CPU chy song song.

Đối vi công vic liên quan đến CPU, hãy s dng:```text id="r5575k"
native extensions
multiprocessing
process pools
thread pools for blocking calls
free-threaded builds where appropriate
external workers
```## 36.11 Đang chờ Coroutine

Cho:```python id="h5auqh"
async def inner():
    return 10

async def outer():
    x = await inner()
    return x + 1
```Dòng chy là:```text id="fi924o"
outer starts
outer calls inner(), producing inner coroutine
outer awaits inner coroutine
event loop drives inner
inner returns 10
outer resumes with x = 10
outer returns 11
```Giá tr tr v vượt qua ranh gii ch đợi tr li khung b treo.

##36.12 Chờ đợi một tương lai

Tương lai đại din cho mt kết qu có th chưa tn ti.```python id="6xf2w8"
future = loop.create_future()
```Mt coroutine có th ch đợi nó:```python id="qze0h0"
value = await future
```Nếu tương lai chưa hoàn tt, coroutine s tm dng.

Sau đó:```python id="nrkg2x"
future.set_result(42)
```Vòng lp s kin đánh du các nhim v đang ch sn sàng. Coroutine đang ch tiếp tc vi`42`.

Nếu tương lai có ngoi l:```python id="xzr05h"
future.set_exception(ValueError("bad"))
```coroutine đang ch s tiếp tc bng cách đưa ra ngoi l đó ti đim ch.

## 36.13 Đang chờ nhiệm vụ

Mt nhim v cũng được ch đợi.```python id="w7s6x8"
task = asyncio.create_task(work())
result = await task
```Nếu nhim v kết thúc bình thường,`await task`tr v kết qu ca nó.

Nếu nhim v tăng lên,`await task`đưa ra ngoi l tương t.

Nếu nhim v b hy b,`await task`tăng lên`CancelledError`.

## 36.14 Hủy bỏ

Vic hy yêu cu mt tác v phi dng li.```python id="j5ce0q"
task.cancel()
```TRONG`asyncio`, vic hy b được thc hin bng cách tiêm`CancelledError`vào coroutine ti mt đim ch.```python id="lczbrw"
async def work():
    try:
        await asyncio.sleep(10)
    except asyncio.CancelledError:
        cleanup()
        raise
```Mt coroutine có th bt được lnh hy để dn dp, nhưng nó thường phi khi động li tr khi nó c ý ngăn chn vic hy.

Vic hy b là hp tác. Mt coroutine không bao gi ch đợi có th không quan sát thy vic hy kp thi.

## 36.15 Dọn dẹp bằng`try/finally`Sử dụng`try/finally`để dọn dẹp không đồng bộ.```python id="j83mx6"
async def work():
    resource = await acquire()
    try:
        await use(resource)
    finally:
        await release(resource)
```các`finally`khi chy trên:```text id="m2ocv7"
normal completion
exception
cancellation
```Nếu quá trình dn dp đang ch x lý thì coroutine có th tm dng trong quá trình dn dp.

Điu này làm cho vic hy b và dn dp tr nên tinh tế. Coroutine có th  trng thái b hy trong khi vn thc thi mã quyết toán.

## 36.16 Trình quản lý bối cảnh không đồng bộ

Trình qun lý bi cnh không đồng b s dng`async with`.

```python id="v2e2wy"
async with lock:
    await work()
```Đối tượng phi cung cp:```text id="5scc5n"
__aenter__
__aexit__
```V mt khái nim:```python id="dkm7oc"
mgr = lock
value = await mgr.__aenter__()
try:
    await work()
except BaseException as exc:
    suppress = await mgr.__aexit__(type(exc), exc, exc.__traceback__)
    if not suppress:
        raise
else:
    await mgr.__aexit__(None, None, None)
```Trình qun lý bi cnh không đồng b cho phép tm dng thu thp và phát hành tài nguyên.

## 36.17 Trình lặp không đồng bộ

S dng lp li không đồng b`async for`.

```python id="hvh27p"
async for item in stream:
    process(item)
```Đối tượng phi cung cp:```text id="u37g80"
__aiter__
__anext__
```V mt khái nim:```python id="z1gd9g"
ait = stream.__aiter__()

while True:
    try:
        item = await ait.__anext__()
    except StopAsyncIteration:
        break
    process(item)
```Lp li không đồng b rt hu ích cho các lung trong đó mi mc tiếp theo có th yêu cu I/O.

## 36.18 Trình tạo không đồng bộ

Trình to không đồng b được xác định bng`async def`Và`yield`.

```python id="65vpyy"
async def lines(reader):
    async for line in reader:
        yield line.strip()
```Nó to ra mt trình vòng lp không đồng b.

S dng:```python id="5lhj9g"
async for line in lines(reader):
    print(line)
```Trình to Async có th va ch va mang li kết qu.```python id="8c9u5e"
async def gen():
    await asyncio.sleep(1)
    yield 1
```H kết hp h thng treo coroutine vi vic to ra giá tr theo kiu máy phát đin.

## 36,19`anext`

`anext`ly mc tiếp theo t mt trình vòng lp không đồng b.```python id="vs0dl0"
item = await anext(ait)
```Điu này đang ch đợi`ait.__anext__()`.

Nếu trình lp async đã hết, nó s tăng`StopAsyncIteration`.

Mt mc định có th được cung cp:```python id="8d97ug"
item = await anext(ait, default)
```## 36,20`StopAsyncIteration`Hoàn thành tín hiệu của trình vòng lặp không đồng bộ với`StopAsyncIteration`.

Điu này khác bit vi`StopIteration`.

```text id="prf78x"
normal iterator ends with StopIteration
async iterator ends with StopAsyncIteration

async forđánh bắtStopAsyncIterationđể thoát khỏi vòng lặp.

Nâng caoStopIterationtừ lần lặp không đồng bộ là không chính xác.

36.21 Mã byte Coroutine

Hàm async biên dịch thành một đối tượng mã được đánh dấu là mã coroutine.```python id="m36blp" async def f(): return 1


Mt chc năng không đồng b vi đang ch:```python id="vb752s"
async def f():
    value = await g()
    return value
```v mt khái nim bao gm mã byte cho:```text id="aw12fn"
call g
get awaitable iterator
send into awaitable
suspend if not done
resume with result
store value
return value
```Mã byte chính xác thay đổi theo phiên bn Python. Mô hình vn còn:`await`được trin khai dưới dng thc thi khung có th tiếp tc.

## 36,22`SEND`và chờ đợi

Mã byte CPython hin đại s dng máy móc ging như gi để điu khin các sn phm đang ch.

V mt khái nim:```text id="c07p30"
await awaitable:
    get awaitable iterator
    send None or value
    if it yields:
        suspend current coroutine
    if it returns:
        resume with result
    if it raises:
        propagate exception
```Điu này liên quan đến y quyn ca máy phát đin. Coroutine được xây dng da trên ý tưởng tương t là gi giá tr vào các phép tính b treo.

## 36.23 Trả về Coroutine

Mt coroutine tr v mt giá tr cui cùng.```python id="11vkrn"
async def f():
    return 42
```Khi ch đợi:```python id="q0irxd"
value = await f()
```coroutine đang ch nhn được`42`.

Trong ni b, s hoàn thành được th hin thông qua giao thc có th ch đợi.  cp độ người dùng,`await`biến vic hoàn thành coroutine thành mt kết qu biu thc thông thường.

## 36.24 Ngoại lệ của Coroutine

Nếu mt coroutine tăng lên, hãy ch nó tăng lên.```python id="ufon8f"
async def f():
    raise ValueError("bad")

async def main():
    await f()
```Ngoi l lan truyn đến`main`ti đim ch.

Bn có th bt nó:```python id="vi414s"
async def main():
    try:
        await f()
    except ValueError:
        return 0
```Truy nguyên bao gm các khung coroutine liên quan đến chui cuc gi không đồng b.

## 36.25 Cảnh báo về Coroutine

Vic to mt coroutine và không bao gi ch đợi nó thường là mt li.```python id="j9rvzc"
async def f():
    return 1

f()
```Điu này to ra mt đối tượng coroutine và loi b nó.

Python có th cnh báo:```text id="e1rugz"
RuntimeWarning: coroutine was never awaited
```Cơ th không bao gi chy.

Cách s dng đúng:```python id="5e8f4p"
await f()
```hoc:```python id="daxsm1"
asyncio.create_task(f())
```## 36,26`asyncio.run`

`asyncio.run`là đim vào tiêu chun để chy chc năng chính không đồng b.```python id="45lxp3"
import asyncio

async def main():
    await asyncio.sleep(1)
    return 42

print(asyncio.run(main()))
```Nó to mt vòng lp s kin, chy coroutine cho đến khi hoàn thành, x lý vic dn dp trình to async cui cùng và đóng vòng lp.

Bn thường gi nó mt ln  cp cao nht ca chương trình.

## 36.27 Chặn cuộc gọi bên trong mã Async

Chn cuc gi s dng vòng lp s kin.

Xu:```python id="upggpj"
import time

async def main():
    time.sleep(5)
```Trong lúc`time.sleep`, vòng lp s kin không th chy các tác v khác.

Tt hơn:```python id="j76gyt"
import asyncio

async def main():
    await asyncio.sleep(5)
```Đối vi các chc năng chn không th thc hin không đồng b, hãy s dng trình thc thi hoc trình tr giúp lung:```python id="bo70ck"
result = await asyncio.to_thread(blocking_function, arg)
```Điu này gi cho vòng lp s kin phn hi nhanh.

## 36.28 Nhóm nhiệm vụ

Các nhim v liên quan đến nhóm đồng thi có cu trúc.```python id="jrw68m"
import asyncio

async def main():
    async with asyncio.TaskGroup() as tg:
        tg.create_task(fetch_one())
        tg.create_task(fetch_two())
```Mt nhóm nhim v ch đợi các nhim v con ca nó. Nếu mt nhim v tht bi, nhóm s điu phi vic hy b và đưa ra các ngoi l được nhóm nếu cn.

Điu này an toàn hơn vic to nhim v mà không theo dõi chúng.

## 36,29 Nhóm ngoại lệ trong mã Async

Nhim v đồng thi có th tht bi cùng nhau.

Nhóm tác v có th báo cáo nhiu li bng cách s dng các nhóm ngoi l.```python id="75j6zk"
try:
    async with asyncio.TaskGroup() as tg:
        tg.create_task(a())
        tg.create_task(b())
except* ValueError as group:
    handle_value_errors(group)

except*có thể phân chia các ngoại lệ được nhóm theo loại.

Điều này rất quan trọng đối với các hệ thống không đồng bộ vì các tác vụ độc lập có thể bị lỗi trong cùng một hoạt động có cấu trúc.

36.30 Trình tạo và dọn dẹp không đồng bộ

Trình tạo không đồng bộ cần dọn dẹp không đồng bộ.python id="6lt8y0" async def gen(): try: yield 1 finally: await cleanup() Nếu trình tạo async chưa cạn kiệt, nó sẽ được đóng lại bằngaclose().

agen = gen()
item = await anext(agen)
await agen.aclose()
```Vòng lặp sự kiện cũng bao gồm máy móc để hoàn thiện các trình tạo không đồng bộ đang chờ xử  trong khi tắt máy.

## 36.31 Phương thức tạo Async

Trình tạo Async hỗ trợ các phương thức tương tự như trình tạo nhưng  thể chờ đợi:

| Phương pháp | Ý nghĩa |
|---|---|
|`__anext__()`| Nhận mục tiếp theo không đồng bộ |
|`asend(value)`| Gửi giá trị vào trình tạo async |
|`athrow(exc)`| Ném ngoại lệ vào trình tạo async |
|`aclose()`| Đóng trình tạo không đồng bộ |

Những phương thức này trả về những thứ  thể chờ đợi.

 dụ:```python id="iuoltd"
value = await agen.__anext__()
await agen.aclose()
```## 36.32 Coroutine và thời gian tham chiếu

Một coroutine bị đình chỉ sẽ giữ cho các biến cục bộ tồn tại.```python id="3yoa52"
async def work():
    data = bytearray(100_000_000)
    await asyncio.sleep(10)
    return len(data)
```Trong khi ngủ,`data`vẫn còn sống  coroutine  thể tiếp tục  sử dụng .

Chuỗi lưu giữ:```text id="fhhddc"
task
    coroutine
        suspended frame
            local data
```Xóa các địa phương lớn trước khi chờ đợi lâu khi  thể:```python id="7hxthq"
async def work():
    data = bytearray(100_000_000)
    result = process(data)
    data = None
    await asyncio.sleep(10)
    return result
```## 36.33 Thời gian thực hiện nhiệm vụ

Một nhiệm vụ giữ cho coroutine của  tồn tại.```python id="4ffgq1"
task = asyncio.create_task(work())
```Cho đến khi tác vụ hoàn thành hoặc bị hủy  hoàn tất, tác vụ sẽ tham chiếu coroutine  trạng thái khung của .

Nếu bạn tạo nhiệm vụ  mất dấu chúng, các ngoại lệ  thể được ghi lại sau đó  tài nguyên  thể vẫn hoạt động lâu hơn dự kiến.

Các mẫu  cấu trúc như nhóm nhiệm vụ giúp kiểm soát thời gian sống.

## 36,34 Dấu vết ngăn xếp không đồng bộ

Dấu vết ngăn xếp không đồng bộ bao gồm các chuỗi coroutine bị treo.

Khi một ngoại lệ đi qua`await`ranh giới, truy nguyên cho biết nơi  được nâng lên  nơi  được chờ đợi.

 dụ:```python id="uyj5ih"
async def a():
    await b()

async def b():
    await c()

async def c():
    1 / 0
```Truy nguyên  thể hiển thị chuỗi không đồng bộ từ`a`ĐẾN`b`ĐẾN`c`.

Điều này  thể thực hiện được  các khung coroutine bảo toàn thông tin về đối tượng   vị trí lệnh.

## 36,35`contextvars`Mã Async thường sử dụng`contextvars`cho trạng thái ngữ cảnh cục bộ.```python id="ulzcon"
from contextvars import ContextVar

request_id = ContextVar("request_id")

async def handle():
    print(request_id.get())
```Không giống như lưu trữ cục bộ theo luồng, các biến ngữ cảnh được thiết kế để hoạt động chính xác trên các chuyển đổi tác vụ không đồng bộ.

Mỗi nhiệm vụ  thể mang bối cảnh riêng của .

Điều này rất quan trọng đối với:```text id="ucdnv4"
request IDs
tracing
logging context
database transaction context
auth state
locale settings
```## 36.36 Async và GIL

 Async không xóa GIL.

Trong CPython truyền thống:```text id="vow7l4"
one thread executes Python bytecode at a time per interpreter
async tasks switch cooperatively at await points
``` không đồng bộ  thể xử  nhiều tác vụ liên quan đến I/O một cách hiệu quả  phần lớn thời gian được dành để chờ đợi các sự kiện bên ngoài.

 không làm cho các vòng lặp Python nặng về CPU thực thi song song.

## 36,37 Không đồng bộ so với Chủ đề

Async  chủ đề giải quyết các vấn đề khác nhau.

| Tính năng | Nhiệm vụ không đồng bộ | Chủ đề |
|---|---|---|
| Lập kế hoạch | Hợp tác  | Kiểm tra trước bởi hệ điều hành  trình thông dịch |
| Chuyển đổi điểm |`await`| Lập kế hoạch chủ đề  chuyển giao GIL |
| Tốt nhất cho | Nhiều tác vụ I/O | Chặn API, tích hợp  đồng bộ |
| Bộ nhớ dùng chung | Cùng một chủ đề thường | Được chia sẻ qua các chủ đề |
| Rủi ro cuộc đua | Thấp hơn nhưng vẫn  thể | Cao hơn |
| Sự song song của CPU trong CPython truyền thống | Không | Bị giới hạn bởi GIL đối với  byte Python |

 Async nêu  ràng về việc tạm ngưng. Chủ đề  thể chuyển đổi  những điểm ít  ràng hơn.

## 36,38 Async so với Trình tạo

Coroutine  trình tạo chia sẻ khả năng thực thi  thể tiếp tục nhưng các giao thức thì khác nhau.

| Tính năng | Máy phát điện | Coroutine |
|---|---|---|
| Định nghĩa |`def`với`yield` | `async def`|
| Sản xuất | Nhiều giá trị mang lại | Một kết quả cuối cùng |
| Người tiêu dùng |`for`, `next`, `send` | `await`, vòng lặp sự kiện |
| Hoàn thành |`StopIteration`| Chờ kết quả hoặc ngoại lệ |
| Công dụng chính | Lặp lại lười biếng | Phối hợp I/O không đồng bộ |
|  thể chờ đợi | Không |  |
|  thể mang lại giá trị đơn giản |  | Không, ngoại trừ trình tạo không đồng bộ |

Một coroutine không phải  một trình vòng lặp. Máy phát điện không thể chờ đợi trực tiếp trừ khi được điều chỉnh.

## 36.39 Trình lập lịch Coroutine tối thiểu

Một bộ lập lịch đồ chơi  thể thể hiện ý tưởng cốt lõi.```python id="zytwib"
from collections import deque

class Sleep:
    def __await__(self):
        yield self
        return None

async def task(name):
    print(name, "start")
    await Sleep()
    print(name, "end")

def run(coros):
    ready = deque(c.__await__() for c in coros)

    while ready:
        aw = ready.popleft()
        try:
            next(aw)
        except StopIteration:
            continue
        ready.append(aw)

run([task("a"), task("b")])
```Đây không phải `asyncio`.  bỏ qua I/O thực, bộ tính giờ, tương lai, hủy, ngoại lệ  trạng thái tác vụ. Nhưng  cho thấy  chế chính:```text id="6z9pem"
coroutine runs
await yields control
scheduler later resumes it
```## 36.40 Những hiểu lầm phổ biến

| Hiểu lầm | Đúng mẫu |
|---|---|
| Gọi một hàm không đồng bộ sẽ chạy  |  tạo ra một đối tượng coroutine |
|`await`bắt đầu một chủ đề mới |  tạm dừng coroutine hiện tại cho đến khi chờ đợi hoàn tất |
| Async làm cho  CPU song song |  chủ yếu giúp hợp tác đồng thời I/O |
| Một coroutine  thể được chờ đợi nhiều lần | Một đối tượng coroutine đại diện cho một lần thực thi |
|`asyncio.create_task`cũng giống như`await`|  lên lịch đồng thời;`await`chờ hoàn thành |
| Chặn cuộc gọi vẫn ổn trong  async | Họ chặn vòng lặp sự kiện |
| Hủy bỏ  ngay lập tức |  hợp tác tiêm một ngoại lệ |
| Async sử dụng trình thông dịch khác |  sử dụng khung CPython  vòng đánh giá |

## 36.41 Chiến lược đọc

Bắt đầu với:```python id="bltl80"
async def f():
    return 1
```Sau đó:```python id="zf4zrn"
async def g():
    value = await f()
    return value + 1
```Thanh tra:```python id="60r9ah"
import dis
import inspect

print(inspect.iscoroutinefunction(f))
coro = f()
print(inspect.getcoroutinestate(coro))
dis.dis(g)
```Sau đó nghiên cứu:```text id="gpxkbm"
await
async with
async for
async generators
tasks
cancellation
TaskGroup
contextvars
blocking calls inside async code
```Đối với mỗi trường hợp, theo dõi:```text id="xhs827"
when the coroutine object is created
when the body starts
where it suspends
what object it awaits
how it resumes
what happens on exception or cancellation
when its frame is cleared
```## 36.42 Tóm tắt chương

Coroutine  các phép tính  thể tiếp tục được sử dụng cho lập trình không đồng bộ. MỘT`async def`cuộc gọi tạo ra một đối tượng coroutine. Nội dung coroutine chỉ chạy khi được chờ đợi hoặc được lên lịch. Tại mỗi`await`, coroutine  thể tạm dừng, giữ nguyên trạng thái khung  sau đó tiếp tục với một giá trị hoặc ngoại lệ.

 hình cốt lõi :```text id="r29f1z"
async function call
    
create coroutine object
    
event loop or await resumes coroutine
    
run until await, return, raise, or cancellation
    
await suspends and yields control
    
resume later with result or exception
```Việc thực thi không đồng bộ được xây dựng trên nền tảng CPython giống như thực thi thông thường: đối tượng , khung,  byte, ngoại lệ  giao thức đối tượng. Vòng lặp sự kiện cung cấp lịch trình; CPython cung cấp khả năng thực thi tiếp tục.