python就业班----协程完成多任务

    科技2022-08-15  88

    """协程实现多任务""" # 迭代器:在原来的基础上得到新的东西----元组、列表、集合、字符串 # for temp in [11,22,33]: # print(temp) # # for temp in "abcdef": # print(temp) # 判断一个东西是否可以迭代 # from collections import Iterable # # isinstance(a,A):判断a是否由A类串出来的 # print(isinstance([11,22,33],Iterable)) # 返回为True,则可以迭代 # print(isinstance('aasdf',Iterable)) # 返回为True,则可以迭代 # print(isinstance(123,Iterable)) # 返回为False,则不可以迭代 """自己实现一个可以迭代的对象.py""" """方法:使用两个类:-------""" # from collections import Iterable # from collections import Iterator # import time # # class Classmate(object): # def __init__(self): # self.names=list() # # def add(self,name): # self.names.append(name) # #定义迭代 # def __iter__(self): # """如果想要一个对象成为一个可以迭代的对象,即可以使用for,那么必须使用__itre__方法""" # return ClassIterator(self) # 返回一个对象的引用 # # # # 迭代器 # class ClassIterator(object): # def __init__(self,obj): # self.obj=obj # self.current_num=0 # def __iter__(self): # pass # def __next__(self): # # 判断是否越界! # if self.current_num<len(self.obj.names): # ret=self.obj.names[self.current_num] # self.current_num+=1 # return ret # else: # 迭代结束时抛出异常,自动结束 # raise StopIteration """改进:只定义一个类""" # from collections import Iterable # from collections import Iterator # import time # # class Classmate(object): # def __init__(self): # self.names=list() # self.current_num=0 # # def add(self,name): # self.names.append(name) # #定义迭代 # def __iter__(self): # """如果想要一个对象成为一个可以迭代的对象,即可以使用for,那么必须使用__itre__方法""" # 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("老王") # classmate.add("王二") # classmate.add("张三") # # # print("判断classmate是否是可以迭代的对象:",isinstance(classmate,Iterable)) # True可以迭代 # # classmate_iterator=iter(classmate) # # print("判断classmate_iterator是否是迭代器:",isinstance(classmate_iterator,Iterable)) # True # # # # print(next(classmate_iterator)) # # # for name in classmate: # print(name) # time.sleep(1) # for temp in obj: # """ # 1.判断obj是否可以迭代 # 2.在第一步成立的前提下,调用iter函数得到obj对象的__iter__方法的返回值 # 3.__iter__方法的返回值是一个迭代器 # """ # print(temp) """迭代器的应用:斐波拉契数列""" # 方法一 # nums=list() # # a=0 # b=1 # i=0 # while i<10: # nums.append(a) # a,b=b,a+b # i+=1 # # for num in nums: # print(num) # 方法二:迭代器 # class Fibonacci(object): # def __init__(self,all_num): # self.all_num=all_num # self.current_num=0 # self.a=0 # self.b=1 # # #定义迭代 # def __iter__(self): # """如果想要一个对象成为一个可以迭代的对象,即可以使用for,那么必须使用__itre__方法""" # return self # 返回一个对象的引用 # def __next__(self): # # 判断是否越界! # if self.current_num<self.all_num: # ret=self.a # self.a,self.b=self.b,self.a+self.b # self.current_num+=1 # return ret # else: # 迭代结束时抛出异常,自动结束 # raise StopIteration # # fibo=Fibonacci(10) # for num in fibo: # print(num) """迭代器的其他使用方式:1.转换数据类型""" # a=(11,22,33) # print(list(a)) """生成器:是一种特殊的迭代器""" # 方法一:将[]变成() # nums=[ x*2 for x in range(10)] # print(nums) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] # # # nums=(x*2 for x in range(10)) # print(nums) # <generator object <genexpr> at 0x0000020FDECBEF90> # # for num in nums: # print(num) # 使用生成器完成斐波拉契数列 # def creat_num(all_num): # # a=0 # # b=1 # a,b=0,1 # current_num=0 # while current_num<all_num: # # print(a) # yield(a) # 如果一个函数中由yield语句,那么这个就不在是函数,而是生成器的模板 # a,b=b,a+b # current_num+=1 # return "---ok---" # 如果在调用creat_num的时候,发现这个函数中有yield那么此时,不是调用语句,而是创建一个生成器对象 # obj=creat_num(10) # # ret=next(obj) # print(ret) # # # ret=next(obj) # print(ret) # obj2=creat_num(20) # while True: # try: # ret=next(obj2) # print(ret) # except Exception as ret: # print(ret.value) #value属性是返回值 # break # for num in obj: # print(num) """使用send启动生成器:f.send()""" # def creat_num(all_num): # # a=0 # # b=1 # a,b=0,1 # current_num=0 # while current_num<all_num: # # print(a) # ret=yield a # 如果一个函数中由yield语句,那么这个就不在是函数,而是生成器的模板 # print("---ret---:",ret) # a,b=b,a+b # current_num+=1 # # obj=creat_num(10) # ret=obj.send(None)# 第一次调用最好不要用send,最好用next,必须使用时传入None # print(ret) # # ret=next(obj) # print(ret) # # ret=obj.send("hhaahh") # print(ret) # send里面的数据会传递给ret=yield a,当做yield a的结果,然后ret保存这个结果 # send的结果是下一次调用yield时yield后面的值 """使用yield生成器完成多任务""" # import time # # # def task_1(): # while True: # print("---1--") # time.sleep(1) # yield # # def task_2(): # while True: # print("----2----") # time.sleep(1) # yield # # # def main(): # t1=task_1() # t2=task_2() # 先让t1运行一会,当t1遇到yield时后,再返回到while True行,然后 # 执行t2,当它遇到yield时,再次切换到t1中 # 这样t1和t2交替运行,最终实现了多任务--------协程 # while True: # next(t1) # next(t2) # # # if __name__=="__main__": # main() """使用greenlet完成多任务""" # from greenlet import greenlet # # import time # # def test1(): # while True: # print("---A----") # gr2.switch() # time.sleep(1) # def test2(): # while True: # print("--B---") # gr1.switch() # time.sleep(1) # # gr1=greenlet(test1) # gr2=greenlet(test2) # # # 切换到gr1中运行 # gr1.switch() """使用gevent完成多任务""" # import gevent # import time # # def f1(n): # for i in range(n): # print(gevent.getcurrent(),i) # # time.sleep(0.5) # gevent.sleep(0.5) # # def f2(n): # for i in range(n): # print(gevent.getcurrent(),i) # # time.sleep(0.5) # gevent.sleep(0.5) # # def f3(n): # for i in range(n): # print(gevent.getcurrent(),i) # # time.sleep(0.5) # gevent.sleep(0.5) # # g1=gevent.spawn(f1,5) # # # g2=gevent.spawn(f2,5) # # g3=gevent.spawn(f3,5) # # g1.join() # g2.join() # g3.join() """打补丁""" # import gevent # import time # from gevent import monkey # monkey.patch_all() # # def f1(n): # for i in range(n): # print(gevent.getcurrent(),i) # time.sleep(0.5) # # # def f2(n): # for i in range(n): # print(gevent.getcurrent(),i) # time.sleep(0.5) # # # def f3(n): # for i in range(n): # print(gevent.getcurrent(),i) # time.sleep(0.5) # # # gevent.joinall([gevent.spawn(f1,5),gevent.spawn(f2,5) # ,gevent.spawn(f3,5)])
    Processed: 0.054, SQL: 8