我举个我最近用上 generator 的例子:
1. 有个模块从关系型数据库里面读取数据,清洗后写入到另外一个 OLAP 数据库。第一版的代码,先把数据清洗后,然后一次性入库到 OLAP 数据库。第二版改成 generator,一边清洗,一边入库。同时入库是按 16k 条纪录批量入库,有个缓冲。内存爆降到原来的 10% 不到。
2. 我写了一个表达式 DSL,lexer 和 parser 之间使用 generator 通信。所以 parser 是这样调用 lexer 的:
token = next(lexer)
if token == "if":
condition_expr = parse_expr(lexer)
elif token == "let":
statement = parse_expr_statement(lexer)
elif ...
所以这里 lexer 和 parser 是两个协程,来回切换。
【 在 ylh1969 的大作中提到: 】
: 看不出这种任务有何使用协程的必要。
: 是在print期间把资源让给其他协程吗?
--
修改:hgoldfish FROM 110.84.122.*
FROM 110.84.122.*