yield实现多任务演示

代码

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


运行结果

yield

猜你喜欢

转载自blog.csdn.net/u010684603/article/details/108423691
今日推荐