31.python协程

from collections import Iterable
from collections import Iterator
import time
import gevent
#是否可迭代
#print(isinstance([11,22,33], Iterable))


#有__iter__可以迭代,自动调 用__iter__
class Classmate(object):
    def __init__(self):
        self.names = list()

    def append_name(self, name):
        self.names.append(name)

    def __iter__(self):
        return ClassIterator(self) #创建实例对象,引用

class ClassIterator(object):
    def __init__(self,classmate):
        self.classmate = classmate
        self.current_num = 0
    def __iter__(self):
        pass
    def __next__(self):
        if self.current_num < len(self.classmate.names):
            ret = self.classmate.names[self.current_num]
            self.current_num += 1
            return ret
        else:
            raise StopIteration


classmate = Classmate()
classmate.append_name("LAO WANG")
classmate.append_name("XIAO LI ")
classmate.append_name("zhang san")
for name in classmate:
    print(name)
    time.sleep(1)

#在一个类里定义
class Classmate(object):
    def __init__(self):
        self.names = list()
        self.current_num = 0

    def add(self, name):
        self.names.append(name)

    def __iter__(self):
        return self
    def __next__(self):
        if self.current_num < len(self.names):
            ret = self.names[self.current_num]
            self.current_num += 1
            return ret
        else:
            raise StopIteration
classmate = Classmate()
classmate.add("LAO WANG")
classmate.add("XIAO LI ")
classmate.add("zhang san")
for name in classmate:
    print(name)
    time.sleep(1)

#迭代器存储生成数据的方式
class Fibo_obj(object):
    def __init__(self,numbers):
        self.numbers = numbers
        self.a = 0
        self.b = 1
        self.current_num = 0
    def __iter__(self):
        return self
    def __next__(self):
        if self.current_num == 0:
            self.current_num += 1
            return self.a
        elif self.current_num < self.numbers:
            self.a, self.b = self.b, self.a + self.b
            self.current_num += 1
            return self.a

        else:
            raise StopIteration
FIBO = Fibo_obj(20)
for i,num in enumerate(FIBO):
    print(i, num)
#生成器,特殊的迭代器,当前迭代到的状态需要自己记录
def fibo(numbers):
    a, b = 0, 1
    current_num = 0
    while current_num < numbers:
        yield a
        a, b = b, a+b
        current_num += 1
    return "Over"
test1 = fibo(25)
test2 = fibo(25)

print(test1)
for i,num in enumerate(test1):
    print(i,num)

while True:
    try:
       ret = next(test2)

       print(ret)
    except Exception as ret:
        print(ret.value)
        break
#send传递参数
def create_num(all_num):
    a, b = 0, 1
    current_num = 0
    while current_num < all_num:
        ret = yield a
        print("<<<ret>>>",ret)
        a, b = b, a+b
        current_num += 1
obj = create_num(10)
ret = next(obj)
print(ret)
ret = obj.send(3)
print(ret)

ret = next(obj)
print(ret)
ret = obj.send(3)
print(ret)
#多任务

def task1():
    print(1)
    time.sleep(1)
    yield
def task2():
    print(2)
    time.sleep(1)
    yield 
while True:
    next(task1())
    next(task2())
#greenlet单线程实现多任务
from greenlet import greenlet
def test1():
    while True:
        print("--a--")
        gr2.switch()
        time.sleep(0.5)
def test2():
    while True:
        print("---b---")
        gr1.switch()
        time.sleep(0.5)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
#携程依赖于资源,切换资源很快,相当于调用函数
#协程利用延时的时间
def f1(n):
    for i in range(n):
        print(gevent.getcurrent(), i)
        gevent.sleep(0.5)
def f2(n):
    for i in range(n):
        print(gevent.getcurrent(), i)
        gevent.sleep(0.5)
def f3(n):
    for i in range(n):
        print(gevent.getcurrent(), i)
        gevent.sleep(0.5)
print("----1----")
g1 = gevent.spawn(f1, 5)
print("----2----")
g2 = gevent.spawn(f2, 5)
print("----3----")
g3 = gevent.spawn(f3, 5)

g1.join()
g2.join()
g3.join()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值