標籤(空格分隔): kotlin
fun numbersfrom(context: coroutinecontext, start: int) = produce(context)
fun filter(context: coroutinecontext, numbers: receivechannel, prime: int) = produce(context)
fun main(args: array) = runblocking
coroutinecontext.cancelchildren() // 取消所有的子協程,從而讓主線程退出
}
粗解:
numbersfrom(2) -> filter(2) -> filter(3) -> filter(5) -> filter(7) ...
filter(3, filter(2, numbers))
細解:首先他的思想就是有乙個資料流:
[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],他首先用2進行過濾,能被2整除的都去除,
這樣就剩下了[3,5,7,9,11,13,15,17,19],然後用3進行過濾【此處遺留3】,
剩下了[5,7,11,13,15,17,19],然後用5進行過濾【此處遺留5】,
剩下了[7,11,13,17,19],此時用7進行過濾【此處遺留7】,
剩下了[11,13,17,19],然後用11進行過濾【此處遺留11】,
剩下了[13,17,19],然後用13進行過濾【此處遺留13】,
剩下了[17,19],然後用17進行過濾【此處遺留17】,
剩下了[19],然後用17進行過濾【此處遺留17】
剩下了上面是處理的思想;
**[此處可忽略不看]**具體的操作:首先產生了乙個通道資料流numberfrom,發出了數字2,資料流掛起,2被接收,通道資料流numberfrom發出了數字3,又掛起;此時同時列印出了2,然後進入filter(cur,2),在這裡面,從cur通道裡面取出3,判斷之後send(3)掛起,此時numberfrom發出4後掛起,而filter(cur,2)也返回乙個通道資料流cur2[針對素數2],然後receive[3],此時cur過濾掉4,列印3,然後filter(cur2,3)開始跑起來,但是目前資料流是空的;接著看,此時cur通道處理4,直接移除,此時numberfrom發出5後掛起,filter(cur,2)從中取出5,判斷send(5)後掛起,[同時numberfrom發出6後掛起,filter(cur,2)直接過濾掉,numberfrom發出7後掛起,filter(cur,2)send(7)後掛起,filter(cur2,3)send(7)後掛起,同時filter(cur3,5)資料流生成,也是空的,此時收到了7,然後send(7)後掛起,又到了一輪的receive],filter(cur2,3)拿到5,send(5)之後掛起,第三輪開啟,receive(5)之後列印
上面很亂的,因為把很多同時做的事情不好同時表述:一次整理:
發到哪呢?此時filter返回了乙個資料流,也叫cur,[此處是復用,為了區分,我們把它叫做cur2=filter(cur,2)]
第一輪算是結束了,開始第二輪
看注釋1處,receive了3
3被列印此時將cur2和數字3傳到filter中[看注釋2,看注釋2處,此時cur2中只有數字5,(5%3!=0)]
經過判斷,發出了數字5,掛起;同時返回資料流通道cur3=filter(cur2,3)
cur3中進行過濾判斷,發出了5,掛起
此時第二輪結束,開始第三輪
5被receive
cur3中收到了9,但是此時cur3剛發出了7,還沒有被receive消耗,所以9暫時存在cur2中
5被列印將cur3和5傳參到filter,cur5=filter(cur3,5)
注釋4處,此時cur3中只有7,7進行判斷過濾,發出了7,掛起
cur3中過濾掉了9
cur3中的接收了11,cur2中接收了12,cur中接收了來自numberfrom中的13 //注釋5
什麼掛起呢?自然是它返回的資料流通道cur5掛起
此時第三輪結束,開始第四輪
7被receive
7被列印此時cur7=filter(cur5,7)誕生,它發出了cur5中的11,掛起 //注釋6
cur3過濾掉了15,接收了17,cur2接收了18,cur接收了19
此時第四輪結束,開始第五輪
注釋6處,11被receive
11被列印cur7中的11被消耗了
依次往前推…
上面的細推如果看懂了,那就基本理解了整個的處理思想和流程,大道化簡
cur=numberfrom() -> cur2=filter(context,cur,2) -> cur3=filter(context,cur2,3) -> cur5=filter(context,cur3,5) -> cur7=filter(context,cur5,7)....
//再化簡
cur=numberfrom() -> cur2=filter(cur,2) -> cur3=filter(cur2,3) -> cur5=filter(cur3,5) -> cur7=filter(cur5,7)....
//再化簡
filter(7,filter(5,filter(3, filter(2, numberfrom))))....
流水線排程
n個作業要在由2臺機器m1和m2組成的流水線上完成加工。每個作業加工的順序都是先在m1上加工,然後在m2上加工。m1和m2加工作業i所需的時間分別為a i 和b i 你可以安排每個作業的執行順序,使得從第乙個作業在機器m1上開始加工,到最後乙個作業在機器m2上加工完成所需的時間最少。求這個最少的時間...
流水線冒險
流水線冒險 回顧一下常用五階段流水線 f 取指 d 解碼 e 執行 m 訪存 w 寫回 注意 對暫存器檔案的寫只有在時鐘上公升的時候才會更新!資料冒險的原因 對暫存器檔案的讀寫是在不同階段進行的 1.用暫停來避免資料冒險 暫停時,處理器會停止流水線中一條或多條指令,直到冒險條件不再滿足。在本該正常處...
渲染流水線
應用階段 cpu準備資料,skinmeshrender,meshfilter,meshrender 頂點資料,三角形資料,法線資料,切線資料,渲染設定指令,紋理資料,uv資料 由cpu傳送給gpu,即一次drawcall 幾何階段 頂點變換,計算頂點顏色 如逐頂點光照 齊次裁剪空間,透視除法,歸一化...