2024年8月31日 Python - asycnio
参考
- asyncio --- 异步 I/O — Python 3.12.4 文档
- asyncio 视频教程 - bilibili
- 6.2.9. yield 表达式 — Python 3.12.4 文档
- PEP 380: 委托给子生成器的语法
yield
介绍
-
yield x
- 生成一个内容
-
yield from
- 委托给子生成器,
yield from iterable
本质上只是for item in iterable
的简写形式
- 委托给子生成器,
-
yield 和 yield from 配合使用
- 形成一个通道,调用者可以通过 send 向子生成器发送内容,子生成器通过yield 接受内容
示例
yield 和 yield from 简单使用
def func1():
yield 11
yield from func2() # 委托给子生成器,yield from iterable 本质上只是 for item in iterable 的简写形式
yield 12
yield from func2()
yield 13
def func2():
yield 21
yield 22
if __name__ == '__main__':
for item in func1():
print(item) # 注意结果:11; 21; 22; 12; 21; 22; 13
# for item in func2():
# print(item) # 21; 22
yield 和 yield from 配合使用
累加器,最好配合调试理解
send 会将数据发往子生成器中的 yield
或者可以理解成子生成器中的 yield 向调用方要求数据
def accumulate():
tally = 0
while 1:
next = yield
if next is None:
return tally
tally += next
def gather_tallies(tallies):
while 1:
tally = yield from accumulate()
tallies.append(tally)
tallies = []
acc = gather_tallies(tallies)
next(acc) # Ensure the accumulator is ready to accept values
for i in range(4):
acc.send(i)
acc.send(None) # Finish the first tally
for i in range(5):
acc.send(i)
acc.send(None) # Finish the second tally
print(tallies) # [6, 10]