多任务协程gevent的使用总结

19次阅读

共计 1438 个字符,预计需要花费 4 分钟才能阅读完成。

协程

一,迭代器 iterable 能实现一定的数据,但是又不会占用很大的空间,协程切换任务资源小,效率高。
如何判断某一类型是否可以迭代
from collections import Iterable


print(isinstance([11,2,3], Iterable))

python2 是如下实现的,python3 中将 range 改成了 xrange
range(2000)生成 2000 个值的结果,会占用很大的内存空间
xrange(2000)是指生成 2000 个值的方式,占用很小的空间。

如果一个对象是迭代器,那么一定可以迭代,如果一个对象可以迭代,但不一定是迭代器。

迭代器对象必须要有__iter__和__next__方法。

如果数据量很大的情况下,最好使用创建迭代器的方式来节省内存空间。
eg:
class Fibo(object):
 def __init__(self, all_num):
 self.all_num = all_num
 self.current_num = 0
 self.a = 0
 self.b = 1


 def __iter__(self):
 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 = Fibo(20)

for temp in fibo:
 print(temp)

二,生成器 generator
生成器是一种特殊的迭代器,可以让函数暂停执行。所以可以利用生成器实现多任务。
生成迭代器有两种方式:

  1. (x*2 for x in range(10)) 返回值就是生成器。
  2. 含有 yield 的函数,此时他不再是一个函数,而是一个生成器对象
  3. 启动生成器有两种方式,next 和 send,next 优先
  4. eg:def fibo(max_num):
 a, b = 0, 1
 current_num = 0
 while current_num < max_num:
 yield a
 a, b = b, a + b
 current_num += 1

fi = fibo(20)
while True:
 try:
 ret = next(fi)
 print(ret)
 except:
 break

三,协程 greenlet、gevent 完成多任务
gevent 是协程最常用的一种方式。当线程在等待执行浪费的时间,可以用协程来解决。协程会在等待时间去执行别的方法。
eg:协程的实际使用

def download_pic(img_name, img_url):
 request = urllib.request.urlopen(img_url)
 img_content = request.read()

 with open(img_name, ‘wb’) as f:
 f.write(img_content)


def main():
 gevent.joinall([
 gevent.spawn(download_pic, ‘1.jpg’, ‘https://timgsa.baidu.com/timg…’),
 gevent.spawn(download_pic, ‘2.jpg’, ‘https://timgsa.baidu.com/timg…’)
 ])


if name == ‘__main__’:
 main()

正文完
 0