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