多任務-----協程gevent的使用總結。

協程python

一,迭代器iterable 能實現必定的數據,可是又不會佔用很大的空間,協程切換任務資源小,效率高。
如何判斷某一類型是否能夠迭代函數

from collections import Iterable



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

python2是以下實現的,python3中將range改爲了xrange
range(2000)生成2000個值的結果,會佔用很大的內存空間
xrange(2000)是指生成2000個值的方式,佔用很小的空間。ui

若是一個對象是迭代器,那麼必定能夠迭代,若是一個對象能夠迭代,但不必定是迭代器。url

迭代器對象必需要有__iter__和__next__方法。spa

若是數據量很大的狀況下,最好使用建立迭代器的方式來節省內存空間。
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
生成器是一種特殊的迭代器,能夠讓函數暫停執行。因此能夠利用生成器實現多任務。
生成迭代器有兩種方式:code

  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?image&quality=80&size=b9999_10000&sec=1556006133066&di=6c4ea03a666b333328d59163b8137de9&imgtype=0&src=http%3A%2F%2Fattach.bbs.miui.com%2Fforum%2F201408%2F27%2F103420lzrq3jcimigfjmuw.jpg'),
        gevent.spawn(download_pic, '2.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1556006133066&di=1f17489eb4f7fd3ce4f16c2365fab82a&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fblog%2F201511%2F08%2F20151108150337_tu32m.jpeg')
    ])


if __name__ == '__main__':
    main()
相關文章
相關標籤/搜索