摘要:協(xié)程一,迭代器能實現(xiàn)一定的數(shù)據(jù),但是又不會占用很大的空間,協(xié)程切換任務(wù)資源小,效率高。迭代器對象必須要有和方法。如果數(shù)據(jù)量很大的情況下,最好使用創(chuàng)建迭代器的方式來節(jié)省內(nèi)存空間。
協(xié)程
一,迭代器iterable 能實現(xiàn)一定的數(shù)據(jù),但是又不會占用很大的空間,協(xié)程切換任務(wù)資源小,效率高。
如何判斷某一類型是否可以迭代
from collections import Iterable??? print(isinstance([11,2,3], Iterable))
python2是如下實現(xiàn)的,python3中將range改成了xrange
range(2000)生成2000個值的結(jié)果,會占用很大的內(nèi)存空間
xrange(2000)是指生成2000個值的方式,占用很小的空間。
如果一個對象是迭代器,那么一定可以迭代,如果一個對象可以迭代,但不一定是迭代器。
迭代器對象必須要有__iter__和__next__方法。
如果數(shù)據(jù)量很大的情況下,最好使用創(chuàng)建迭代器的方式來節(jié)省內(nèi)存空間。
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
生成器是一種特殊的迭代器,可以讓函數(shù)暫停執(zhí)行。所以可以利用生成器實現(xiàn)多任務(wù)。
生成迭代器有兩種方式:
(x*2 for x in range(10)) 返回值就是生成器。
含有yield的函數(shù),此時他不再是一個函數(shù),而是一個生成器對象
啟動生成器有兩種方式,next和send,next優(yōu)先
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
三,協(xié)程greenlet、gevent完成多任務(wù)
gevent是協(xié)程最常用的一種方式。當(dāng)線程在等待執(zhí)行浪費的時間,可以用協(xié)程來解決。協(xié)程會在等待時間去執(zhí)行別的方法。
eg:協(xié)程的實際使用
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()
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/43637.html
摘要:隨著我們對于效率的追求不斷提高,基于單線程來實現(xiàn)并發(fā)又成為一個新的課題,即只用一個主線程很明顯可利用的只有一個情況下實現(xiàn)并發(fā)。作為的補充可以檢測操作,在遇到操作的情況下才發(fā)生切換協(xié)程介紹協(xié)程是單線程下的并發(fā),又稱微線程,纖程。 引子 之前我們學(xué)習(xí)了線程、進程的概念,了解了在操作系統(tǒng)中進程是資源分配的最小單位,線程是CPU調(diào)度的最小單位。按道理來說我們已經(jīng)算是把cpu的利用率提高很多了。...
摘要:協(xié)程,又稱微線程,纖程。最大的優(yōu)勢就是協(xié)程極高的執(zhí)行效率。生產(chǎn)者產(chǎn)出第條數(shù)據(jù)返回更新值更新消費者正在調(diào)用第條數(shù)據(jù)查看當(dāng)前進行的線程函數(shù)中有,返回值為生成器庫實現(xiàn)協(xié)程通過提供了對協(xié)程的基本支持,但是不完全。 協(xié)程,又稱微線程,纖程。英文名Coroutine協(xié)程看上去也是子程序,但執(zhí)行過程中,在子程序內(nèi)部可中斷,然后轉(zhuǎn)而執(zhí)行別的子程序,在適當(dāng)?shù)臅r候再返回來接著執(zhí)行。 最大的優(yōu)勢就是協(xié)程極高...
摘要:事件循環(huán)是異步編程的底層基石。對事件集合進行輪詢,調(diào)用回調(diào)函數(shù)等一輪事件循環(huán)結(jié)束,循環(huán)往復(fù)。協(xié)程直接利用代碼的執(zhí)行位置來表示狀態(tài),而回調(diào)則是維護了一堆數(shù)據(jù)結(jié)構(gòu)來處理狀態(tài)。時代的協(xié)程技術(shù)主要是,另一個比較小眾。 Coding Crush Python開發(fā)工程師 主要負責(zé)豈安科技業(yè)務(wù)風(fēng)險情報系統(tǒng)redq。 引言 1.1. 存儲器山 存儲器山是 Randal Bryant 在《深入...
摘要:所以與多線程相比,線程的數(shù)量越多,協(xié)程性能的優(yōu)勢越明顯。值得一提的是,在此過程中,只有一個線程在執(zhí)行,因此這與多線程的概念是不一樣的。 真正有知識的人的成長過程,就像麥穗的成長過程:麥穗空的時候,麥子長得很快,麥穗驕傲地高高昂起,但是,麥穗成熟飽滿時,它們開始謙虛,垂下麥芒。 ——蒙田《蒙田隨筆全集》 上篇論述了關(guān)于python多線程是否是雞肋的問題,得到了一些網(wǎng)友的認可,當(dāng)然也有...
摘要:協(xié)程實現(xiàn)連接在網(wǎng)絡(luò)通信中,每個連接都必須創(chuàng)建新線程或進程來處理,否則,單線程在處理連接的過程中,無法接受其他客戶端的連接。所以我們嘗試使用協(xié)程來實現(xiàn)服務(wù)器對多個客戶端的響應(yīng)。 協(xié)程實現(xiàn)TCP連接 在網(wǎng)絡(luò)通信中,每個連接都必須創(chuàng)建新線程(或進程) 來處理,否則,單線程在處理連接的過程中, 無法接受其他客戶端的連接。所以我們嘗試使用協(xié)程來實現(xiàn)服務(wù)器對多個客戶端的響應(yīng)。與單一TCP通信的構(gòu)架...
閱讀 1454·2019-08-30 12:54
閱讀 1936·2019-08-30 11:16
閱讀 1668·2019-08-30 10:50
閱讀 2549·2019-08-29 16:17
閱讀 1343·2019-08-26 12:17
閱讀 1435·2019-08-26 10:15
閱讀 2451·2019-08-23 18:38
閱讀 840·2019-08-23 17:50