摘要:協程一,迭代器能實現一定的數據,但是又不會占用很大的空間,協程切換任務資源小,效率高。迭代器對象必須要有和方法。如果數據量很大的情況下,最好使用創建迭代器的方式來節省內存空間。
協程
一,迭代器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
生成器是一種特殊的迭代器,可以讓函數暫停執行。所以可以利用生成器實現多任務。
生成迭代器有兩種方式:
(x*2 for x in range(10)) 返回值就是生成器。
含有yield的函數,此時他不再是一個函數,而是一個生成器對象
啟動生成器有兩種方式,next和send,next優先
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()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43637.html
摘要:隨著我們對于效率的追求不斷提高,基于單線程來實現并發又成為一個新的課題,即只用一個主線程很明顯可利用的只有一個情況下實現并發。作為的補充可以檢測操作,在遇到操作的情況下才發生切換協程介紹協程是單線程下的并發,又稱微線程,纖程。 引子 之前我們學習了線程、進程的概念,了解了在操作系統中進程是資源分配的最小單位,線程是CPU調度的最小單位。按道理來說我們已經算是把cpu的利用率提高很多了。...
摘要:協程,又稱微線程,纖程。最大的優勢就是協程極高的執行效率。生產者產出第條數據返回更新值更新消費者正在調用第條數據查看當前進行的線程函數中有,返回值為生成器庫實現協程通過提供了對協程的基本支持,但是不完全。 協程,又稱微線程,纖程。英文名Coroutine協程看上去也是子程序,但執行過程中,在子程序內部可中斷,然后轉而執行別的子程序,在適當的時候再返回來接著執行。 最大的優勢就是協程極高...
摘要:事件循環是異步編程的底層基石。對事件集合進行輪詢,調用回調函數等一輪事件循環結束,循環往復。協程直接利用代碼的執行位置來表示狀態,而回調則是維護了一堆數據結構來處理狀態。時代的協程技術主要是,另一個比較小眾。 Coding Crush Python開發工程師 主要負責豈安科技業務風險情報系統redq。 引言 1.1. 存儲器山 存儲器山是 Randal Bryant 在《深入...
摘要:所以與多線程相比,線程的數量越多,協程性能的優勢越明顯。值得一提的是,在此過程中,只有一個線程在執行,因此這與多線程的概念是不一樣的。 真正有知識的人的成長過程,就像麥穗的成長過程:麥穗空的時候,麥子長得很快,麥穗驕傲地高高昂起,但是,麥穗成熟飽滿時,它們開始謙虛,垂下麥芒。 ——蒙田《蒙田隨筆全集》 上篇論述了關于python多線程是否是雞肋的問題,得到了一些網友的認可,當然也有...
摘要:協程實現連接在網絡通信中,每個連接都必須創建新線程或進程來處理,否則,單線程在處理連接的過程中,無法接受其他客戶端的連接。所以我們嘗試使用協程來實現服務器對多個客戶端的響應。 協程實現TCP連接 在網絡通信中,每個連接都必須創建新線程(或進程) 來處理,否則,單線程在處理連接的過程中, 無法接受其他客戶端的連接。所以我們嘗試使用協程來實現服務器對多個客戶端的響應。與單一TCP通信的構架...
閱讀 1392·2019-08-30 12:54
閱讀 1878·2019-08-30 11:16
閱讀 1621·2019-08-30 10:50
閱讀 2455·2019-08-29 16:17
閱讀 1275·2019-08-26 12:17
閱讀 1387·2019-08-26 10:15
閱讀 2396·2019-08-23 18:38
閱讀 792·2019-08-23 17:50