代码
import time
def task1():
"""任务1函数"""
i = 0
while True:
print("-----in task1-----")
time.sleep(1)
# 主程序中通过next()拿到yield后面的值
# 生成器对象.send(“发送的数据”),这时发送的数据传递到yield,当做yield的返回值
result = yield i
if result == "stop":
# 函数返回时,会抛出StopIteration异常
# return后的结果就是StopIteration异常的详情信息
return "execute task1 done"
# 模拟生成器中的计算
i += 1
def task2():
"""任务2函数"""
i = 100
while True:
print("------in task2------")
time.sleep(1)
# 主程序中通过next()拿到yield后面的值
# 生成器对象.send(“发送的数据”),这时发送的数据传递到yield,当做yield的返回值
result = yield i
if result == "stop_stop":
# 函数返回时,会抛出StopIteration异常
# return后的结果就是StopIteration异常的详情信息
return "execute task2 done"
# 模拟生成器中的计算
i += 2
if __name__ == '__main__':
# 函数中有yield,此时拿到的是生成器对象
task_1 = task1()
task_2 = task2()
# 任务停止执行的标志位
stop_task1 = False
stop_task2 = False
# 循环次数记录
i = 0
while True:
# 当主程序循环到第四次要开始时
if i == 3:
try:
# 给生成器传递参数
task_1.send("stop")
# 捕获生成器停止执行的信号,生成器中return的结果就是StopIteration异常的详情信息
except StopIteration as task_1_return_info:
# execute task1 done
# 接收到task1()函数的返回值
print(task_1_return_info)
stop_task1 = True
# 当任务1没有停止执行时
if not stop_task1:
# 生成器返回结果给主程序
# 获取yield后面跟的值,此时函数中的代码会暂停
result_1 = next(task_1)
print("-----in main get value from task_1 is [{}]---------".format(result_1))
# 当任务2没有停止执行时
if not stop_task2:
# 获取yield后面跟的值,此时函数中的代码会暂停
result_2 = next(task_2)
print("-----in main get value from task_2 is [{}]---------".format(result_2))
# 当生成器【任务2】拿到的值是120时
if result_2 == 120:
try:
# 给生成器传递参数
task_2.send("stop_stop")
# 捕获生成器停止执行的信号,生成器中return的结果就是StopIteration异常的详情信息
except StopIteration as task_2_return_info:
print(task_2_return_info)
stop_task2 = True
# 退出while循环
break
# while循环次数+1
i += 1