yield实现异步 demo_code

from collections import deque


def async_sum(func_id, n):
    res = 0
    for i in range(n):
        res = res + 1
        print('Function id:{},step:{}'.format(func_id, i))
        yield
    return res


a = async_sum('函数一', 3)
b = async_sum('函数二', 4)

# next(a)
# next(b)
# next(a)
# next(b)
# next(a)
# next(b)


class Task:
    next_id = 0

    def __init__(self, routine):
        self.id = Task.next_id
        Task.next_id += 1
        self.routine = routine


class Scheduler:
    def __init__(self):
        self.runnable_tasks = deque()
        self.completed_task_result = {}
        self.failed_task_error = {}

    def add(self, routine):
        task = Task(routine)
        self.runnable_tasks.append(task)
        return task.id

    def run_to_completion(self):
        while len(self.runnable_tasks) != 0:
            task = self.runnable_tasks.popleft()
            print('Running task{}'.format(task.id), end='')
            try:
                yielded = next(task.routine)
            except StopIteration as stopped:
                print('completed with result{!r}'.format(stopped.value))
                self.completed_task_result[task.id] = stopped.value
            except Exception as e:
                print('failed with exception:{}'.format(e))
                self.failed_task_error[task.id] = e
            else:
                assert yielded is None
                print('now yielded')
                self.runnable_tasks.append(task)


scheduler = Scheduler()
scheduler.add(a)
scheduler.add(b)

scheduler.run_to_completion()

复制代码

转载于:https://juejin.im/post/5c66be44f265da2dbe02d0b1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值