現代汽車:2018冬奧推新款燃料電池車

韓國現代汽車集團宣布,將在2018年的平昌冬季奧運會之際,發表全新款的燃料電池電動車。

媒體報導,現代汽車認為冬奧是展現新技術的最佳場域,因此決定趁2018冬奧機會,推出全新的燃料電池車產品。現代汽車集團環保發展部門主任Ahn Byung-ki表示,新車的尺寸介於CUV與SUV之間,將採用更小、更輕的電池和馬達,但馬力會更高。

市場普遍認為,這款汽車將先以概念車的形式於2018年展現於世人眼前,最快要到2020年才會有量產車型上市。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

眾泰汽車被舉報騙補 借殼金馬股份或生變

昨日一則關於眾泰汽車涉嫌騙取國家補貼的舉報,在網路上被迅速傳播:江蘇宿遷眾泰經銷商舉報眾泰汽車為了拿到新能源補貼,在國家大力查處騙補之時,大量生產眾泰新能源雲100早產車。由於生產日期與全身玻璃相差3-5個月,車管所拒絕過戶導致大量車主無法上牌,經銷商無法幫車主解決此問題於是舉報廠家。  
 
專項嚴打   恰恰是面臨著2016年新能源補貼將降低的時間節點,也激發了新能源汽車銷量出現井噴。據報導,2015年11月我國的新能源商用車單月產量超過全球其他國家總和。新能源汽車產銷超常增速背後的“虛火”,也引起了管理部門的關注。   2016年1月初,國家資訊中心資源開發部主任徐長明公開表達了對新能源汽車的質疑, 正是在這樣的質疑聲中,2016年1月21日,四部委聯合發佈《關於開展新能源汽車推廣應用核查工作的通知》,隨後這一“騙補核查行動”更是上升為由國務院牽頭。5月28日,財政部官網消息稱,關於新能源汽車推廣騙補的現場核查已經完成,目前處於會審階段,但並未透露任何核查細節。  
眾泰之危   值得關注的是,上市公司金馬股份已經於今年3月28日發佈公告,計畫以116億元的估值收購眾泰汽車全部股權。然而金馬股份卻在7月6日撤回了收購方案申報,眾泰汽車的借殼上市計畫也戛然而止。恰在這樣一個敏感的時點,關於眾泰汽車騙取新能源汽車補貼的舉報現於網路,並被快速傳播。   也正是由於眾泰汽車的盈利對於新能源汽車補貼的高度依賴,也使得針對該公司騙取新能源補貼的舉報備受關注,相關人士表示,如果這個舉報最終被證實,那麼對於眾泰汽車的借殼上市而言,就是絕殺,不僅是經營層面違法違規、可能面臨高額處罰,而且從最終的財務影響來看也會涉及到財務造假。   文章來源:環球網

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

比亞迪斥資110億元 擴充電池產能/推新車

據比亞迪官方獲悉,比亞迪將投入人民幣110億元對旗下兩家子公司進行增資。本次增資將用於對比亞迪汽車工業有限公司和鐵動力離子電池擴產項目,未來電池產能有望得到擴充,並將加速新能源車型的研發進度。  
  隨著資金的引入,比亞迪在新車研發速度也將加快。根據規劃,比亞迪首款以中國古朝代命名的新能源MPV—商雙模版將於今年下半年發佈並上市。此外,宋雙模版、純電動版以及一款名為M5的全新車型也將於今年下半年上市。   除上述建設專案外,基於青海豐富的鋰資源,比亞迪將于青海投資建立新電池工廠。而與青海的合作也意味著比亞迪切入產業鏈上游,有利於其在新能源汽車領域的佈局和規劃,實現資源分享。   文章來源:網通社

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

特斯拉將推純電動MPV 與MODEL X共用平臺打造

據海外媒體報導,未來特斯拉有望推出一款全新純電動MPV車型。由於特斯拉MODEL X的生產平臺具備良好的可擴展性,特斯拉純電動MPV將與MODEL X共用平臺打造,在外觀方面有可能借鑒大眾BUDD-e的設計風格。  
  雖然目前關於這款MPV的消息十分有限,但外媒根據埃隆•馬斯克上月底公佈的特斯拉未來戰略規劃推測,特斯拉的MPV在車內空間設計方面將以靈活、多用途為主,除了能容納較多乘客外,還要便於用戶放置嬰兒車、自行車、輪椅等大型物件。更多有關這款MPV的消息,我們要等到2017年其概念車型亮相後才能知曉。   文章來源:汽車之家

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

賓士將推出四款電動車與特斯拉競爭

今年7月,有梅賽德斯•賓士內部員工透露,該公司將於九月份發佈一款概念版的電動車與特斯拉競爭。而今天看來,梅賽德斯•賓士的計畫遠不止這些。  
  根據外媒最新消息,梅賽德斯•賓士不會僅僅局限於一兩款產品,賓士計畫推出四款電動汽車產品,希望能夠與特斯拉、寶馬等對手進行正面競爭,同時這四款電動汽車將會採用全新的命名方式。   根據梅賽德斯•賓士執行董事長Dieter Zetsche表示,第一款電動汽車將會在今年10月的巴黎車展上亮相,同時另外還有三款其它類型的產品,一共包括了兩款電動轎車和兩款電動SUV,並且預計在2020年之前陸續上市。而在今年的巴黎車展上我們將看到一款SUV產品,並且續航里程將會達到讓人印象深刻的500公里。而這輛賓士的電動SUV除了擁有強悍的續航里程之外,還將與特斯拉的Model X直接競爭。   文章來源:雷鋒網

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

2020即將到來,看完這篇幫你詳細了解數據策略

 

隨着企業與数字科技融合程度的逐漸加深,越來越多的企業在数字化轉型之路上感到前所未有的焦慮。他們相信組織已經擁有了具有經濟價值的數據資源,期望它能像其他資產那樣為組織帶來更多的未來利益。

諸如員工資產,與數據一樣,員工也是企業資產的重要組成部分。只不過相較於數據資產管理在國內企業中仍然處於早期階段。大部分企業在員工的選育用留上已經形成了一套標準化流程和相對成熟的管理策略。基於此,我們是不是應該考慮像管理員工資產那樣,以相同的方式處理數據呢?這時,數據策略顯得尤為重要。

 

一、數據策略的定義

 

數據策略是用於獲取、集成、存儲、保護、管理、監控、分析、使用和操作數據的方法。現代而全面的數據策略所涉及的不僅僅是數據,它是定義人員、流程和技術的路線圖,闡明了數據將如何實現和激發業務策略。

 

具體包括:闡明目標願景和實現該願景的實用指南,明確闡述成功標準和關鍵績效指標,這些指標可用於評估和合理化所有後續數據計劃。而不包含針對特定技術問題的詳細解決方案。隨着企業目標的發展,數據戰略並非一成不變,需要緊跟企業的技術創新和運作方式。

 

二、為什麼企業要建立數據策略

 

鑒於前面闡述的背景,數據策略與員工的選育用留策略一樣,都是為了更科學地管理企業資產。如果沒有策略,組織將被動應對各業務部門提出的數據要求。從前台業務、市場,到中後台的財務、供應鏈、人力資源,都會向一個部門提需求,可能涉及到某種數據分析、主數據管理、商業智能、數據治理、數據質量計劃等。

 

導致數據部門每天對外要理解業務數據需求的內涵,竭力排期滿足,對內要運維所使用的陳舊工具和系統,保證其正常運行,每天不堪重負。一旦出現數據質量、元數據等問題,就會被挑戰得體無完膚,甚至會升級到能力和信任的高度。更為關鍵的是,如果無法及時正確地支持這些計劃,很容易導致企業做出錯誤的商業決策。

 

三、誰來制定、推動數據策略

 

請不要將企業範圍的數據策略僅僅交給首席信息官(CIO),為什麼?數據不僅僅是IT資產,而是一種企業資產,數據策略在一定程度上是一種企業戰略。

DataPipeline認為,CEO和董事會需要深刻理解快速將數據戰略落地的意義和風險,並着手構建下述組織架構,鼓勵相應的文化和創新。

 

CEO相較於其他企業角色,既要關注生存,也要關注發展,而數據很難做到立竿見影,所以平衡短期收益與長期發展考驗的是CEO的智慧。如果CEO在公布決策時都是引用數據,並對企業內部的數據創新非常熟悉,那麼數據策略已經成功了一半,否則其他人的努力有極大概率會付諸東流。

 

CDO由CEO領導,直接負責公司組織內部數據發展策略落地的詳細路徑和整體節奏,根據業務模式確定合規要求、需求滿足的價值、速度、流程、以及自動化、智能化技術路線的選擇。這裏一定要注意滿足業務需求的速度和質量,由於數據需求的挑戰較大,太多CDO無法在一定時間,一定業務範圍內快速達成CEO、董事會、業務部門希望看到的效果。沒有一個好的起點,首席數據官的工作就會喪失前進的節奏,陷於和業務部門就數據的上收、使用等流程長期討論和拉鋸的泥潭中,造成惡性循環,使這個崗位變成高危職位。據DataPipeline觀察,很多企業開始設立CDO的崗位,並嘗試通過數據帶來業務增長,客觀來說,這和其他高管職位一樣,是一個機遇與挑戰並存的情況。

 

數據合規與標準委員會由CEO領導,並由公司的業務線領導、法務領導、首席數據官組成,詳細制定出數據使用的邊界、自由度和數據質量標準。負責隨着業務的發展保持最高頻率(一般是一周一次)的討論更新,同時使用自動化的工具將規則同步至數據系統中。如果業務的變化無法從合規層面保持一致,就會逐步成為限制數據使用的瓶頸。這裏的挑戰在於不讓規則討論過於大而全,要儘快在一定範圍內達成共識,逐步推動部分範圍內規則地快速落地,否則會使願景的落地失去前進節奏。

 

數據部門由首席數據官領導,包括數據工程師,分析師和數據科學家。數據工程師負責使用符合時代挑戰的自研或者商業的工具,確保業務用戶可以自助式地完成數據全生命周期的使用和管理。同時負責企業內外的數據源能自動高效地集成融合,快速滿足業務取數、用數需求,另外通過保證元數據、主數據、數據血緣與業務發展時刻保持一致,讓業務準確無誤地理解數據語義。

他們不僅要確保大數據平台的負載均衡、穩定性,可以隨時響應業務對數據模型的計算和查詢需求。還要遵循標準委員制定的標準,通過手工制定規則和各種算法確保數據質量並盡可能做到前置預警。最後,也是非常重要的一點,在應對業務部門的需求時,需要有一套“定價體系”。因為數據支持業務的發展探索是存在成本的,但目前業務部門對此並無感知,更核算不出ROI。在成本面前,很容易篩選出真需求,排出優先級,並且在後續服務中理清ROI。這條路舉步維艱,但又勢在必行,否則數據部門的業務價值困境始終會存在。 有時數據部門在沒有設立首席數據官的情況下也由CIO領導,這時有一個職責劃分藝術,每個企業的情況都不同,但CDO的重點職責是在合適的企業內帶領數據組用數據快速產生業務價值。CIO的職責範圍更廣,但專精的領域不在該點上。

 

業務部門中應當擁有能深入理解業務的分析師和科學家,自助使用數據部門提供的工具,這時使用門檻會不斷降低,取數用數的難度和周期也會大幅下降,技能的要求一般是SQL級別。因此業務部門需要更加理解數據,並構思數據可以應用到自身業務發展的角度,再通過管理數據使用的全生命周期,在實踐中不斷總結。挑戰在於如何能快速用數據高效地帶來業務價值,通過解耦來擺脫髮展受到數據部門效率制約的現狀。

 

四、數據策略中的數據融合策略

 

1. 為什麼要制定數據融合策略

企業希望在未來以數據支持數據應用和數據業務,但前提是能夠隨時隨心快速提取使用數據。在此過程中存在一些壁壘,諸如技術、組織、文化等。如果沒有提前思考這些難點,在後續朝目標努力時,會遇到很大的阻力,甚至有可能讓項目流產。

2. 制定數據融合策略時需要思考回答哪些問題

在搞清楚為什麼制定數據融合策略之後,接下來我們將從以下幾方面展開:

Who:組織中,誰將參与數據融合?是否有具備編程知識的IT專家解決所有數據融合任務?還是需要使業務部門的員工能夠自己使用數據融合工具?一旦實施,潛在的技術風險和實施周期是什麼?這些問題將對您選擇購買的數據融合解決方案的類型產生重大影響。

What:哪些數據可能需要集成?在DataPipeline看來,我們反對大而全,支持企業按需制定非常靈活的數據融合策略。企業需要反向從業務角度去思考,從全局角度梳理清楚在未來一到三年或更長期的時間內,有哪些業務目標希望通過數據去驅動,這些數據包括哪些數據,這些數據都存在於哪裡,避免重複建設。

如果只存在幾個數據孤島,對企業來說,最具成本效益的策略可能是選擇可以滿足特定需求的基本數據交換或ETL工具。但是,如果需要集成許多不同的孤島(或者不同類型的數據),那麼最好使用功能更為全面的數據融合平台。

When:何時進行數據融合?企業一旦制定了數據策略,接下來數據融合策略將會被擺在一個非常高的位置上。因為,如果不做數據融合,其餘事情將會舉步維艱,但從時間上要做通盤考慮,進行一個頂層設計,然後再按階段逐步進行。

如果要創建數據倉庫,則數據融合可能會在分析之前進行。如果要創建基於Hadoop或類似技術的數據湖,以原始未更改的形式存儲數據,則將在運行分析工作負載之前進行一些數據融合。目前許多企業都有數據倉庫和數據湖,選擇何種體繫結構將影響數據融合所需的技術類型。

Where:數據融合將在哪裡進行?雲和本地並不是一個矛盾,因為現在有許多公司既有本地的IDC(數據中心),又有雲上,甚至是多雲的架構。企業需要選擇一種能夠支持本地部署、雲上部署、Docker,在容器大的平台上多管齊下的數據融合工具。另外,該工具的現代化和智能化程度還應該適應企業當中非常複雜多變的環境。

How:如何進行數據融合?這個問題最為複雜,因為它涉及到工具、文化和流程。關於員工,作為企業和組織的戰略性資源,我們並非要將每個人都訓練成高水平、有經驗、訓練有素的數據工程師。而應注重培養其數據意識,知道如何使用數據,如何去發揮數據的價值。

同時企業應該採取靈活易用、穩定的數據融合工具。面對再厲害的人才,如果沒有匹配相應的工具和方法論,在工作中也很難游刃有餘。未來企業需要多思考何種工具,何種平台,何種工作方式能讓組織儘快釋放數據效能。

 

3. 選擇數據融合平台需要做哪些考量

公司需要結合自身的發展階段、信息化建設水平以及人員的素養等情況,來選擇自己的解決方案。

如果研發人員較多,可選擇的範圍相對會比較廣泛。面對開源和商業的數據融合工具,您需要根據企業的需求和對生產的要求進行選擇。開源是很好的方式,可以先從這裏嘗試做起,但是對於業務的連續性要求和有些生產級別的要求,可能就需要商業工具。

另外,關於一些技術考量點,可以看這篇文章:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

Kotlin Coroutines不複雜, 我來幫你理一理

Coroutines 協程

最近在總結Kotlin的一些東西, 發現協程這塊確實不容易說清楚. 之前的那篇就寫得不好, 所以決定重寫.
反覆研究了官網文檔和各種教程博客, 本篇內容是最基礎也最主要的內容, 力求小白也能看懂並理解.

Coroutines概念

Coroutines(協程), 計算機程序組件, 通過允許任務掛起和恢復執行, 來支持非搶佔式的多任務. (見).

協程主要是為了異步, 非阻塞的代碼. 這個概念並不是Kotlin特有的, Go, Python等多個語言中都有支持.

Kotlin Coroutines

Kotlin中用協程來做異步和非阻塞任務, 主要優點是代碼可讀性好, 不用回調函數. (用協程寫的異步代碼乍一看很像同步代碼.)

Kotlin對協程的支持是在語言級別的, 在標準庫中只提供了最低程度的APIs, 然後把很多功能都代理到庫中.

Kotlin中只加了suspend作為關鍵字.
asyncawait不是Kotlin的關鍵字, 也不是標準庫的一部分.

比起futures和promises, kotlin中suspending function的概念為異步操作提供了一種更安全和不易出錯的抽象.

kotlinx.coroutines是協程的庫, 為了使用它的核心功能, 項目需要增加kotlinx-coroutines-core的依賴.

Coroutines Basics: 協程到底是什麼?

先上一段官方的demo:

import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch


fun main() {
    GlobalScope.launch { // launch a new coroutine in background and continue
        delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
        println("World!") // print after delay
    }
    println("Hello,") // main thread continues while coroutine is delayed
    Thread.sleep(2000L) // block main thread for 2 seconds to keep JVM alive
}

這段代碼的輸出:
先打印Hello, 延遲1s之後, 打印World.

對這段代碼的解釋:

launch開始了一個計算, 這個計算是可掛起的(suspendable), 它在計算過程中, 釋放了底層的線程, 當協程執行完成, 就會恢復(resume).

這種可掛起的計算就叫做一個協程(coroutine). 所以我們可以簡單地說launch開始了一個新的協程.

注意, 主線程需要等待協程結束, 如果註釋掉最後一行的Thread.sleep(2000L), 則只打印Hello, 沒有World.

協程和線程的關係

coroutine(協程)可以理解為輕量級的線程. 多個協程可以并行運行, 互相等待, 互相通信. 協程和線程的最大區別就是協程非常輕量(cheap), 我們可以創建成千上萬個協程而不必考慮性能.

協程是運行在線程上可以被掛起的運算. 可以被掛起, 意味着運算可以被暫停, 從線程移除, 存儲在內存里. 此時, 線程就可以自由做其他事情. 當計算準備好繼續進行時, 它會返回線程(但不一定要是同一個線程).

默認情況下, 協程運行在一個共享的線程池裡, 線程還是存在的, 只是一個線程可以運行多個協程, 所以線程沒必要太多.

調試

在上面的代碼中加上線程的名字:

fun main() {
    GlobalScope.launch {
        // launch a new coroutine in background and continue
        delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
        println("World! + ${Thread.currentThread().name}") // print after delay
    }
    println("Hello, + ${Thread.currentThread().name}") // main thread continues while coroutine is delayed
    Thread.sleep(2000L) // block main thread for 2 seconds to keep JVM alive
}

可以在IDE的Edit Configurations中設置VM options: -Dkotlinx.coroutines.debug, 運行程序, 會在log中打印出代碼運行的協程信息:

Hello, + main
World! + DefaultDispatcher-worker-1 @coroutine#1

suspend function

上面例子中的delay方法是一個suspend function.
delay()Thread.sleep()的區別是: delay()方法可以在不阻塞線程的情況下延遲協程. (It doesn’t block a thread, but only suspends the coroutine itself). 而Thread.sleep()則阻塞了當前線程.

所以, suspend的意思就是協程作用域被掛起了, 但是當前線程中協程作用域之外的代碼不被阻塞.

如果把GlobalScope.launch替換為thread, delay方法下面會出現紅線報錯:

Suspend functions are only allowed to be called from a coroutine or another suspend function

suspend方法只能在協程或者另一個suspend方法中被調用.

在協程等待的過程中, 線程會返回線程池, 當協程等待結束, 協程會在線程池中一個空閑的線程上恢復. (The thread is returned to the pool while the coroutine is waiting, and when the waiting is done, the coroutine resumes on a free thread in the pool.)

啟動協程

啟動一個新的協程, 常用的主要有以下幾種方式:

  • launch
  • async
  • runBlocking

它們被稱為coroutine builders. 不同的庫可以定義其他更多的構建方式.

runBlocking: 連接blocking和non-blocking的世界

runBlocking用來連接阻塞和非阻塞的世界.

runBlocking可以建立一個阻塞當前線程的協程. 所以它主要被用來在main函數中或者測試中使用, 作為連接函數.

比如前面的例子可以改寫成:

fun main() = runBlocking<Unit> {
    // start main coroutine
    GlobalScope.launch {
        // launch a new coroutine in background and continue
        delay(1000L)
        println("World! + ${Thread.currentThread().name}")
    }
    println("Hello, + ${Thread.currentThread().name}") // main coroutine continues here immediately
    delay(2000L) // delaying for 2 seconds to keep JVM alive
}

最後不再使用Thread.sleep(), 使用delay()就可以了.
程序輸出:

Hello, + main @coroutine#1
World! + DefaultDispatcher-worker-1 @coroutine#2

launch: 返回Job

上面的例子delay了一段時間來等待一個協程結束, 不是一個好的方法.

launch返回Job, 代表一個協程, 我們可以用Jobjoin()方法來顯式地等待這個協程結束:

fun main() = runBlocking {
    val job = GlobalScope.launch {
        // launch a new coroutine and keep a reference to its Job
        delay(1000L)
        println("World! + ${Thread.currentThread().name}")
    }
    println("Hello, + ${Thread.currentThread().name}")
    job.join() // wait until child coroutine completes
}

輸出結果和上面是一樣的.

Job還有一個重要的用途是cancel(), 用於取消不再需要的協程任務.

async: 從協程返回值

async開啟線程, 返回Deferred<T>, Deferred<T>Job的子類, 有一個await()函數, 可以返回協程的結果.

await()也是suspend函數, 只能在協程之內調用.

fun main() = runBlocking {
    // @coroutine#1
    println(Thread.currentThread().name)
    val deferred: Deferred<Int> = async {
        // @coroutine#2
        loadData()
    }
    println("waiting..." + Thread.currentThread().name)
    println(deferred.await()) // suspend @coroutine#1
}

suspend fun loadData(): Int {
    println("loading..." + Thread.currentThread().name)
    delay(1000L) // suspend @coroutine#2
    println("loaded!" + Thread.currentThread().name)
    return 42
}

運行結果:

main @coroutine#1
waiting...main @coroutine#1
loading...main @coroutine#2
loaded!main @coroutine#2
42

Context, Dispatcher和Scope

看一下launch方法的聲明:

public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job {
...
}

其中有幾個相關概念我們要了解一下.

協程總是在一個context下運行, 類型是接口CoroutineContext. 協程的context是一個索引集合, 其中包含各種元素, 重要元素就有Job和dispatcher. Job代表了這個協程, 那麼dispatcher是做什麼的呢?

構建協程的coroutine builder: launch, async, 都是CoroutineScope類型的擴展方法. 查看CoroutineScope接口, 其中含有CoroutineContext的引用. scope是什麼? 有什麼作用呢?

下面我們就來回答這些問題.

Dispatchers和線程

Context中的CoroutineDispatcher可以指定協程運行在什麼線程上. 可以是一個指定的線程, 線程池, 或者不限.

看一個例子:

fun main() = runBlocking<Unit> {
    launch {
        // context of the parent, main runBlocking coroutine
        println("main runBlocking      : I'm working in thread ${Thread.currentThread().name}")
    }
    launch(Dispatchers.Unconfined) {
        // not confined -- will work with main thread
        println("Unconfined            : I'm working in thread ${Thread.currentThread().name}")
    }
    launch(Dispatchers.Default) {
        // will get dispatched to DefaultDispatcher
        println("Default               : I'm working in thread ${Thread.currentThread().name}")
    }
    launch(newSingleThreadContext("MyOwnThread")) {
        // will get its own new thread
        println("newSingleThreadContext: I'm working in thread ${Thread.currentThread().name}")
    }
}

運行后打印出:

Unconfined            : I'm working in thread main
Default               : I'm working in thread DefaultDispatcher-worker-1
newSingleThreadContext: I'm working in thread MyOwnThread
main runBlocking      : I'm working in thread main

API提供了幾種選項:

  • Dispatchers.Default代表使用JVM上的共享線程池, 其大小由CPU核數決定, 不過即便是單核也有兩個線程. 通常用來做CPU密集型工作, 比如排序或複雜計算等.
  • Dispatchers.Main指定主線程, 用來做UI更新相關的事情. (需要添加依賴, 比如kotlinx-coroutines-android.) 如果我們在主線程上啟動一個新的協程時, 主線程忙碌, 這個協程也會被掛起, 僅當線程有空時會被恢復執行.
  • Dispatchers.IO: 採用on-demand創建的線程池, 用於網絡或者是讀寫文件的工作.
  • Dispatchers.Unconfined: 不指定特定線程, 這是一個特殊的dispatcher.

如果不明確指定dispatcher, 協程將會繼承它被啟動的那個scope的context(其中包含了dispatcher).

在實踐中, 更推薦使用外部scope的dispatcher, 由調用方決定上下文. 這樣也方便測試.

newSingleThreadContext創建了一個線程來跑協程, 一個專註的線程算是一種昂貴的資源, 在實際的應用中需要被釋放或者存儲復用.

切換線程還可以用withContext, 可以在指定的協程context下運行代碼, 掛起直到它結束, 返回結果.
另一種方式是新啟一個協程, 然後用join明確地掛起等待.

在Android這種UI應用中, 比較常見的做法是, 頂部協程用CoroutineDispatchers.Main, 當需要在別的線程上做一些事情的時候, 再明確指定一個不同的dispatcher.

Scope是什麼?

launch, asyncrunBlocking開啟新協程的時候, 它們自動創建相應的scope. 所有的這些方法都有一個帶receiver的lambda參數, 默認的receiver類型是CoroutineScope.

IDE會提示this: CoroutineScope:

launch { /* this: CoroutineScope */
}

當我們在runBlocking, launch, 或async的大括號裏面再創建一個新的協程的時候, 自動就在這個scope里創建:

fun main() = runBlocking {
    /* this: CoroutineScope */
    launch { /* ... */ }
    // the same as:
    this.launch { /* ... */ }
}

因為launch是一個擴展方法, 所以上面例子中默認的receiver是this.
這個例子中launch所啟動的協程被稱作外部協程(runBlocking啟動的協程)的child. 這種”parent-child”的關係通過scope傳遞: child在parent的scope中啟動.

協程的父子關係:

  • 當一個協程在另一個協程的scope中被啟動時, 自動繼承其context, 並且新協程的Job會作為父協程Job的child.

所以, 關於scope目前有兩個關鍵知識點:

  • 我們開啟一個協程的時候, 總是在一個CoroutineScope里.
  • Scope用來管理不同協程之間的父子關係和結構.

協程的父子關係有以下兩個特性:

  • 父協程被取消時, 所有的子協程都被取消.
  • 父協程永遠會等待所有的子協程結束.

值得注意的是, 也可以不啟動協程就創建一個新的scope. 創建scope可以用工廠方法: MainScope()CoroutineScope().

coroutineScope()方法也可以創建scope. 當我們需要以結構化的方式在suspend函數內部啟動新的協程, 我們創建的新的scope, 自動成為suspend函數被調用的外部scope的child.

上面的父子關係, 可以進一步抽象到, 沒有parent協程, 由scope來管理其中所有的子協程.

Scope在實際應用中解決什麼問題呢? 如果我們的應用中, 有一個對象是有自己的生命周期的, 但是這個對象又不是協程, 比如Android應用中的Activity, 其中啟動了一些協程來做異步操作, 更新數據等, 當Activity被銷毀的時候需要取消所有的協程, 來避免內存泄漏. 我們就可以利用CoroutineScope來做這件事: 創建一個CoroutineScope對象和activity的生命周期綁定, 或者讓activity實現CoroutineScope接口.

所以, scope的主要作用就是記錄所有的協程, 並且可以取消它們.

A CoroutineScope keeps track of all your coroutines, and it can cancel all of the coroutines started in it.

Structured Concurrency

這種利用scope將協程結構化組織起來的機制, 被稱為”structured concurrency”.
好處是:

  • scope自動負責子協程, 子協程的生命和scope綁定.
  • scope可以自動取消所有的子協程.
  • scope自動等待所有的子協程結束. 如果scope和一個parent協程綁定, 父協程會等待這個scope中所有的子協程完成.

通過這種結構化的併發模式: 我們可以在創建top級別的協程時, 指定主要的context一次, 所有嵌套的協程會自動繼承這個context, 只在有需要的時候進行修改即可.

GlobalScope: daemon

GlobalScope啟動的協程都是獨立的, 它們的生命只受到application的限制. 即GlobalScope啟動的協程沒有parent, 和它被啟動時所在的外部的scope沒有關係.

launch(Dispatchers.Default) { ... }GlobalScope.launch { ... }用的dispatcher是一樣的.

GlobalScope啟動的協程並不會保持進程活躍. 它們就像daemon threads(守護線程)一樣, 如果JVM發現沒有其他一般的線程, 就會關閉.

參考

第三方博客:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

接檔補貼 發改委發佈新能源汽車碳配額管理辦法徵求意見稿

8月11日,國家發展改革辦公廳向有關部門下發了《新能源汽車碳配額管理辦法》徵求意見稿,要求相關部委、企業、行業協會等在8月25日之前回饋書面意見。   徵求意見稿稱:制定該政策基於兩方面原因,一方面,隨著新能源汽車產銷量不斷增長,大規模財稅補貼難以為繼;一方面,燃油汽車產能結構性過剩問題已開始凸顯。主要針對的企業為生產和進口燃油汽車達到一定規模的企業,對於燃油汽車企業產銷未達到一定規模、但新能源汽車達到一定數量,且自願納入管理的企業也可按此管理辦法執行。   該管理辦法中所指的新能源車主要包括符合GB/T19596、GB/T24548、QC/T837等有關國家標準或行業標準的純電動汽車、插電式混合動力汽車、燃料電池汽車。擬於2017年開始試行,2018年正式實施。   該管理辦法借鑒了美國加州ZEV政策,並結合中國已有的《碳排放權交易管理條例(送審稿)》,增加了新能源汽車碳配額管理相關條例,將兩者合併實施對汽車碳排放進行管理。   公告原文如下:  
 

   
 

 







 


文章來源:第一電動網   

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

大眾將推新續航里程480公里電動汽車 價格比特斯拉低

大眾計畫將在2025年前推出30款純電動汽車,並且每年的產量將會達到200到300萬之間,而現在大眾想要完成這個目標,似乎要抓緊時間了。根據早期大眾的計畫來看,大眾將會帶來一款全新的電動汽車。  
  大眾公司首席執行官Hebert Diess在接受採訪時表示,這款新的電動汽車在長度上與高爾夫比較接近,但是軸距與帕薩特同級別。據悉,這款原型車將在巴黎車展首次亮相,並且將從2018到2019年期間開始量產。   Diess還表示,這款新的電動汽車續航里程將達到400到600公里,並且採用了比美國環保署更寬鬆的歐洲NEDC里程評級。而如果到了美國市場,這款新的續航立場大約在480公里左右。而這個特斯拉擁有這個續航里程基本的車型,價格上要比大眾新車高出不少。   文章來源:互聯網

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

特斯拉發表 P100D,百公里加速 2.5 秒

電動車廠特斯拉(Tesla)週二發佈新版 Model S 轎車和 Model X 多功能跑車,型號都為P100D,較P90D更為高端。這兩款新車型將配備更加強大的電池組,可令Model S車型成為世界上加速最快的批量生產汽車。  
  Model S P100D和Model X P100D在啟動加速方面和電池續航方面都有了突破性提升。其中Model S P100D配備一個100kWh的電池組,在 Ludicrous (超級加速)模式下從靜止加速至時速60英里僅需2.5秒,相比之下P90D在Ludicrous模式下所需的加速時間為2.8秒。   特斯拉宣稱Model S P100D在啟動加速方面媲美全球頂級超跑,是全球量產型號中加速最快的一個。此外,Model S P100D EPA有效行駛里程為315英里。另一輛Model X P100D車型的車重更大,從靜止加速至時速60英里僅需2.9秒,單次充電續航里程將達289英里,略低於Model S P100D。售價方面,新Model S起始售價將為13.45萬美元,Model X的起始售價將為13.55萬美元。   文章來源: IT之家

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象