避之唯恐不及 仍有泰人採集蝙蝠糞便維生

摘錄自2020年3月24日公視報導

蝙蝠被認為極可能是新型冠狀病毒的宿主。不過在泰國卻有一群人,甘願冒著染病的風險進到蝙蝠的洞穴,採取大量蝙蝠糞便;原來蝙蝠的糞便不但可以當肥料販賣,而且利潤也高,泰國村莊有好幾個世代都以此維生。

由於洞穴裡的蝙蝠數量極多,靠著帽子上的燈光,村民只要進入蝙蝠洞約三小時,就能蒐集到大約500桶蝙蝠糞便,能賣得約7萬多台幣。蝙蝠糞便含有豐富的氮、磷酸鹽和鉀,被當成高營養價值的肥料販賣。有公司專門收購,透過網路在亞馬遜跟阿里巴巴都買得到。

蝙蝠在叻丕府備受重視,除了肥料的經濟效益外,透過蝙蝠捕食破壞水稻和其他作物的昆蟲,在授粉和控制蟲害方面也發揮作用,蝙蝠洞也列為動物保護區。不過這些村民在進入蝙蝠洞時並沒有專業保護,只穿了長袖長褲,避免和蝙蝠接觸。雖然撿拾的是乾燥的蝙蝠糞便,傳播病毒的機率較低,但有學者提出警告,理論上任何跟蝙蝠有關的東西都可能使人暴露在潛在病毒中。萬一在收集蝙蝠糞便的過程中,接觸到新鮮的蝙蝠唾液或尿液,都很有可能染上病毒。

生態保育
國際新聞
泰國
蝙蝠
糞便
武漢肺炎

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※小三通海運與一般國際貿易有何不同?

※小三通快遞通關作業有哪些?

德國政府為推廣電動汽車 計畫為消費者免稅10年

德國政府計畫至2020年德國電動車保有量由當前的3萬輛左右增加至上百萬輛,此外,政府近日出臺了總共8頁的“未來移動方案”檔,檔中提議,為2020年以前購買電動車的個人消費者提供為期10年的免稅優惠。

檔中還提出了進一步措施,包括大規模擴張充電站、從2017年1月1日起將政府用車中電動車的比例提高至20%、以及推出電動車電池研發項目。這些措施將在德國南部Rust舉行的政黨官員會議中進行討論。

據報導,經過數個月的討論,由德國總理安格拉•默克爾(Angela Merkel)保守黨及社會民主黨(SPD)成員組成的議會團體已經就檔相關要點達成一致,或在本週四對全部的決議作出決定。

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

【其他文章推薦】

※台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※小三通海運與一般國際貿易有何不同?

※小三通快遞通關作業有哪些?

一文帶你深入了解 Redis 的持久化方式及其原理

Redis 提供了兩種持久化方式,一種是基於快照形式的 RDB,另一種是基於日誌形式的 AOF,每種方式都有自己的優缺點,本文將介紹 Redis 這兩種持久化方式,希望閱讀本文後你對 Redis 的這兩種方式有更加全面、清晰的認識。

RDB 快照方式持久化

先從 RDB 快照方式聊起,RDB 是 Redis 默認開啟的持久化方式,並不需要我們單獨開啟,先來看看跟 RDB 相關的配置信息:

################################ SNAPSHOTTING  ################################
#
# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
#   save ""
# 自動生成快照的觸發機制 中間的是時間,單位秒,後面的是變更數據 60 秒變更 10000 條數據則自動生成快照
save 900 1
save 300 10
save 60 10000

# 生成快照失敗時,主線程是否停止寫入
stop-writes-on-bgsave-error yes

# 是否採用壓縮算法存儲
rdbcompression yes

# 數據恢復時是否檢測 RDB文件有效性
rdbchecksum yes

# The filename where to dump the DB
# RDB 快照生成的文件名稱
dbfilename dump.rdb

# 快照生成的路徑 AOF 也是存放在這個路徑下面
dir .

關於 RDB 相關配置信息不多,需要我們調整的就更少了,我們只需要根據自己的業務量修改生成快照的機制和文件存放路徑即可。

RDB 有兩種持久化方式:手動觸發 和 自動觸發,手動觸發使用以下兩個命令:

  • save:會阻塞當前 Redis 服務器響應其他命令,直到 RDB 快照生成完成為止,對於內存 比較大的實例會造成長時間阻塞,所以線上環境不建議使用

  • bgsave:Redis 主進程會 fork 一個子進程,RDB 快照生成有子進程來負責,完成之後,子進程自動結束,bgsave 只會在 fork 子進程的時候短暫的阻塞,這個過程是非常短的,所以推薦使用該命令來手動觸發

除了執行命令手動觸發之外,Redis 內部還存在自動觸發 RDB 的持久化機制,在以下幾種情況下 Redis 會自動觸發 RDB 持久化:

  • 在配置中配置了 save 相關配置信息,如我們上面配置文件中的 save 60 10000 ,也可以把它歸類為“save m n”格式的配置,表示 m 秒內數據集存在 n 次修改時,會自動觸發 bgsave。

  • 在主從情況下,如果從節點執行全量複製操作,主節點自動執行 bgsave 生成 RDB 文件併發送給從節點

  • 執行 debug reload 命令重新加載 Redis 時,也會自動觸發 save 操作

  • 默認情況下執行 shutdown 命令時,如果沒有開啟 AOF 持久化功能則自動執行 bgsave

上面就是 RDB 持久化的方式,可以看出 save 命令使用的比較少,大多數情況下使用的都是 bgsave 命令,所以這個 bgsave 命令還是有一些東西,那接下來我們就一起看看 bgsave 背後的原理,先從流程圖開始入手:

bgsave 命令大概有以下幾個步驟:

  • 1、執行 bgsave 命令,Redis 主進程判斷當前是否存在正在執行的 RDB/AOF 子進程,如果存在, bgsave 命令直接返回不在往下執行。
  • 2、父進程執行 fork 操作創建子進程,fork 操作過程中父進程會阻塞,fork 完成後父進程將不在阻塞可以接受其他命令。
  • 3、子進程創建新的 RDB 文件,基於父進程當前內存數據生成臨時快照文件,完成後用新的 RDB 文件替換原有的 RDB 文件,並且給父進程發送 RDB 快照生成完畢通知

上面就是 bgsave 命令背後的一些內容,RDB 的內容就差不多了,我們一起來總結 RDB 持久化的優缺點,RDB 方式的優點:

  • RDB 快照是某一時刻 Redis 節點內存數據,非常適合做備份,上傳到遠程服務器或者文件系統中,用於容災備份
  • 數據恢復時 RDB 要遠遠快於 AOF

有優點同樣存在缺點,RDB 的缺點有:

  • RDB 持久化方式數據沒辦法做到實時持久化/秒級持久化。我們已經知道了 bgsave 命令每次運行都要執行 fork 操作創建子進程,屬於重量級操作,頻繁執行成本過高。
  • RDB 文件使用特定二進制格式保存,Redis 版本演進過程中有多個格式 的 RDB 版本,存在老版本 Redis 服務無法兼容新版 RDB 格式的問題

如果我們對數據要求比較高,每一秒的數據都不能丟,RDB 持久化方式肯定是不能夠滿足要求的,那 Redis 有沒有辦法滿足呢,答案是有的,那就是接下來的 AOF 持久化方式

AOF 持久化方式

Redis 默認並沒有開啟 AOF 持久化方式,需要我們自行開啟,在 redis.conf 配置文件中將 appendonly no 調整為 appendonly yes,這樣就開啟了 AOF 持久化,與 RDB 不同的是 AOF 是以記錄操作命令的形式來持久化數據的,我們可以查看以下 AOF 的持久化文件 appendonly.aof

*2
$6
SELECT
$1
0
*3
$3
set
$6
mykey1
$6
你好
*3
$3
set
$4
key2
$5
hello
*1
$8

大概就是長這樣的,具體的你可以查看你 Redis 服務器上的 appendonly.aof 配置文件,這也意味着我們可以在 appendonly.aof 文件中國修改值,等 Redis 重啟時將會加載修改之後的值。看似一些簡單的操作命令,其實從命令到 appendonly.aof 這個過程中非常有學問的,下面時 AOF 持久化流程圖:

在 AOF 持久化過程中有兩個非常重要的操作:一個是將操作命令追加到 AOF_BUF 緩存區,另一個是 AOF_buf 緩存區數據同步到 AOF 文件,接下來我們詳細聊一聊這兩個操作:

1、為什麼要將命令寫入到 aof_buf 緩存區而不是直接寫入到 aof 文件?

我們知道 Redis 是單線程響應,如果每次寫入 AOF 命令都直接追加到磁盤上的 AOF 文件中,這樣頻繁的 IO 開銷,Redis 的性能就完成取決於你的機器硬件了,為了提升 Redis 的響應效率就添加了一層 aof_buf 緩存層, 利用的是操作系統的 cache 技術,這樣就提升了 Redis 的性能,雖然這樣性能是解決了,但是同時也引入了一個問題,aof_buf 緩存區數據如何同步到 AOF 文件呢?由誰同步呢?這就是我們接下來要聊的一個操作:fsync 操作

2、aof_buf 緩存區數據如何同步到 aof 文件中?

aof_buf 緩存區數據寫入到 aof 文件是有 linux 系統去完成的,由於 Linux 系統調度機制周期比較長,如果系統故障宕機了,意味着一個周期內的數據將全部丟失,這不是我們想要的,所以 Linux 提供了一個 fsync 命令,fsync 是針對單個文件操作(比如這裏的 AOF 文件),做強制硬盤同步,fsync 將阻塞直到寫入硬盤完成后返回,保證了數據持久化,正是由於有這個命令,所以 redis 提供了配置項讓我們自行決定何時進行磁盤同步,redis 在 redis.conf 中提供了appendfsync 配置項,有如下三個選項:

# appendfsync always
appendfsync everysec
# appendfsync no
  • always:每次有寫入命令都進行緩存區與磁盤數據同步,這樣保證不會有數據丟失,但是這樣會導致 redis 的吞吐量大大下降,下降到每秒只能支持幾百的 TPS ,這違背了 redis 的設計,所以不推薦使用這種方式
  • everysec:這是 redis 默認的同步機制,雖然每秒同步一次數據,看上去時間也很快的,但是它對 redis 的吞吐量沒有任何影響,每秒同步一次的話意味着最壞的情況下我們只會丟失 1 秒的數據, 推薦使用這種同步機制,兼顧性能和數據安全
  • no:不做任何處理,緩存區與 aof 文件同步交給系統去調度,操作系統同步調度的周期不固定,最長會有 30 秒的間隔,這樣出故障了就會丟失比較多的數據。

這就是三種磁盤同步策略,但是你有沒有注意到一個問題,AOF 文件都是追加的,隨着服務器的運行 AOF 文件會越來越大,體積過大的 AOF 文件對 redis 服務器甚至是主機都會有影響,而且在 Redis 重啟時加載過大的 AOF 文件需要過多的時間,這些都是不友好的,那 Redis 是如何解決這個問題的呢?Redis 引入了重寫機制來解決 AOF 文件過大的問題。

3、Redis 是如何進行 AOF 文件重寫的?

Redis AOF 文件重寫是把 Redis 進程內的數據轉化為寫命令同步到新 AOF 文件的過程,重寫之後的 AOF 文件會比舊的 AOF 文件占更小的體積,這是由以下幾個原因導致的:

  • 進程內已經超時的數據不再寫入文件
  • 舊的 AOF 文件含有無效命令,如 del key1、hdel key2、srem keys、set a111、set a222等。重寫使用進程內數據直接生成,這樣新的AOF文件只保 留最終數據的寫入命令
  • 多條寫命令可以合併為一個,如:lpush list a、lpush list b、lpush list c可以轉化為:lpush list a b c。為了防止單條命令過大造成客戶端緩衝區溢 出,對於 list、set、hash、zset 等類型操作,以 64 個元素為界拆分為多條。

重寫之後的 AOF 文件體積更小了,不但能夠節約磁盤空間,更重要的是在 Redis 數據恢復時,更小體積的 AOF 文件加載時間更短。AOF 文件重寫跟 RDB 持久化一樣分為手動觸發和自動觸發,手動觸發直接調用 bgrewriteaof 命令就好了,我們後面會詳細聊一聊這個命令,自動觸發就需要我們在 redis.conf 中修改以下幾個配置

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
  • auto-aof-rewrite-percentage:代表當前 AOF文件空間 (aof_current_size)和上一次重寫后 AOF 文件空間(aof_base_size)的比值,默認是 100%,也就是一樣大的時候
  • auto-aof-rewrite-min-size:表示運行 AOF 重寫時 AOF 文件最小體積,默認為 64MB,也就是說 AOF 文件最小為 64MB 才有可能觸發重寫

滿足了這兩個條件,Redis 就會自動觸發 AOF 文件重寫,AOF 文件重寫的細節跟 RDB 持久化生成快照有點類似,下面是 AOF 文件重寫流程圖:

AOF 文件重寫也是交給子進程來完成,跟 RDB 生成快照很像,AOF 文件重寫在重寫期間建立了一個 aof_rewrite_buf 緩存區來保存重寫期間主進程響應的命令,等新的 AOF 文件重寫完成后,將這部分文件同步到新的 AOF 文件中,最後用新的 AOF 文件替換掉舊的 AOF 文件。需要注意的是在重寫期間,舊的 AOF 文件依然會進行磁盤同步,這樣做的目的是防止重寫失敗導致數據丟失,

Redis 持久化數據恢復

我們知道 Redis 是基於內存的,所有的數據都存放在內存中,由於機器宕機或者其他因素重啟了就會導致我們的數據全部丟失,這也就是要做持久化的原因,當服務器重啟時,Redis 會從持久化文件中加載數據,這樣我們的數據就恢復到了重啟前的數據,在數據恢復這一塊Redis 是如何實現的?我們先來看看數據恢復的流程圖:

Redis 的數據恢複流程比較簡單,優先恢復的是 AOF 文件,如果 AOF 文件不存在時則嘗試加載 RDB 文件,為什麼 RDB 的恢復速度比 AOF 文件快,但是還是會優先加載 AOF 文件呢?我個人認為是 AOF 文件數據更全面並且 AOF 兼容性比 RDB 強,需要注意的是當存在 RDB/AOF 時,如果數據加載不成功,Redis 服務啟動會失敗。

最後

目前互聯網上很多大佬都有 Redis 系列教程,如有雷同,請多多包涵了。原創不易,碼字不易,還希望大家多多支持。若文中有所錯誤之處,還望提出,謝謝。

歡迎掃碼關注微信公眾號:「平頭哥的技術博文」,和平頭哥一起學習,一起進步。

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

※台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※小三通海運與一般國際貿易有何不同?

※小三通快遞通關作業有哪些?

Model 3 還不夠平價?Elon Musk:將推出更便宜的 Model 4

Tesla 新款電動車 Model 3 將在 2017 年下半年出貨,這款定價僅為 3.5 萬美元的電動車在預售期獲得了巨大的成功,這將是一款改變汽車市場規則的產品,Tesla CEO Elon Musk 在接受採訪時表示,Tesla 的下一款產品將比 Model 3 更便宜。

Model 3 是 Tesla 迄今為止推出的最便宜的電動車,這款車在性能和規格上與豪華車相比也不遜色,單次充電續航里程達到 200 英里,定價僅為 3.5 萬美元,早期訂購的消費者還可以享受到電動車的稅率補貼。   Model 3 定價吸引了大量消費者關注,Tesla CEO Elon Musk 最近接受採訪時透露,Tesla 早期推出的 Roadster、Model S 和 Model X 這款價格相對較高的電動車,是為積累資金,為推出一款平價的電動車打下基礎,但 Model 3 不會是 Tesla 唯一的一款平價電動車。   Tesla 的目標是讓更多的人買得起電動車,Model 3 的推出已經讓一半的人能夠買得起電動車,Tesla 的下一個目標就是把定價做得更低,第四代電動車車型更小,價格更低,使用更方便,最終達成讓每個人都偶買得起電動車的目標。   除了創造優質實惠的電動車給消費者外,Elon Musk 另一個計畫就是研發無人駕駛的公車,減少城市的壅堵。在更便宜的 Model 4 面世之前,Tesla 面對的最大挑戰是短期內提高產能,完成 Model 3 的訂單,據業內人士透露目前 Model 3 的訂單量已經超過了 Tesla 的產能,甚至最終都無法完全交付。

(首圖來源: CC BY 2.0)    (本文授權轉載自《》─〈〉)

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

【其他文章推薦】

※台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※小三通海運與一般國際貿易有何不同?

※小三通快遞通關作業有哪些?

打造最可靠的自動駕駛基礎架構

文章作者:莫璐怡 Pony.ai

編輯整理:Hoh Xil

內容來源:Pony.ai & DataFun AI Talk

出品社區:DataFun

注:歡迎轉載,轉載請在留言區留言。

導讀:本次分享的主題為打造最可靠的自動駕駛基礎架構。主要內容包括如何做 Pony.ai 自動駕駛系統的基礎架構,涉及到的技術困難,以及我們是如何克服的。

首先先了解下傳統互聯網公司的基礎架構:

數據基礎設施,會包括大規模的數據庫、分佈式的文件系統;

計算平台,可能會需要大量的服務器、大數據平台、容器的管理機制;

Web 服務管理,同時還會有各種各樣的 Web Service,不停的迭代來滿足新的業務發展。

這是傳統互聯網公司要做的事情,但是對於自動駕駛公司和 Pony.ai,在這樣的架構基礎上我們還會做哪些事情?

這是 Pony.ai 的基礎架構,包含了所有傳統互聯網公司要做的事情,除此之外,還需要做如下事情:

自動駕駛車載系統,如何支持各種各樣的AI技術、算法,如何控制車輛,這都依賴於自動駕駛車載系統來完成。

大規模仿真平台,Pony.ai 每天至少會跑 30W 公里的仿真測試(很多自動駕駛公司一年跑的里程可能只有百萬級別),這點對於自動駕駛測試來說非常重要。

車隊運營基礎平台,Pony.ai 要打造自己的移動出行服務,需要基礎平台來支持 Robotaxi 的運營。

可視化平台與人機接口,可視化平台是幫助我們了解系統到底是如何思考、運作的,或者當測試工程師做各種測試的時候都依賴於可視化平台;人機接口,自動駕駛車輛最終是要提供出行服務,是有乘客在裏面,這時會有一個可視化的界面,來告訴乘客車所感知的周圍環境,以及接下來的駕駛操作等等信息,同時還會提供人機交互的功能,讓乘客也能控制車輛,比如輸入目的地,或者需要停車等等。

Pony.ai 的目標是打造自動駕駛移動出行平台,我們希望可以在不同的城市,可以提供大規模自動駕駛車輛的運營,那麼我們的基礎架構會面臨以下挑戰:

車輛數量的增加,目前廣州已經有幾十輛車在進行測試,同時還在不停的增長着;

運營區域的擴大,剛開始只是在很小的區域進行測試,目前已經在幾百平方公里的區域進行測試;

數據量的增長,我們有很多的傳感器,以及車輛和運營區域的增加,都使得數據量的增長非常非常非常大;

工程師數量的增長,目前 Pony.ai 有廣深、北京、美國四個 office,工程師的數量每周都在增長,所以導致模塊數量和內部代碼的數量也在增長。

所有的這些增長都要求我們的技術棧是具有可擴展性的,來滿足快速增長所帶來的挑戰。

剛剛講了整個基礎架構,其中重要的一點就是車載系統,在講車載系統之前,先簡單介紹下自動駕駛系統:

傳感器及其他硬件:激光雷達、高分辨率攝像頭、毫米波雷達、GNSS/IMU、運算平台,我們可看到圖中標了不同的顏色,目前這些傳感器是通過 Supplier Partner 來得到的,我們自己不做傳感器,我們需要去購買他們的產品,但是購買之後需要做數據進一步的分析和整合,然後做後面的處理,然後對於運算平台除了 supplier 的一些應用外,我們自己也會做一些優化。傳感器主要要做的事情就是接收真實世界的數據,然後傳遞給 Pony.ai 自動駕駛系統中。

自動駕駛系統:首先,要做傳感器融合,進行時間同步,將多傳感器的數據融合在一起;然後是感知模塊,用來感知周圍的環境有什麼樣的障礙物和物體;接下來會進行行為預測,預測這樣的障礙物或物體之後的行為會是什麼樣的;然後才到我們的決策規劃模塊,按照之前的預測來決定之後車輛的動作,如急剎車、讓路、超車等動作;最後,就是我們的控制模塊,他會按照決策規劃模塊,告知我們的系統要怎麼做,然後決定怎麼踩剎車、油門,怎麼打方向盤。

車輛,我們本身是不造車的,所以車輛是由 OEM 提供的,但是整個控制的算法,是我們自研去做的。

除此之外,還有高精地圖與定位模塊,以及數據與系統架構(數據的處理,以及控制數據在不同模塊的流動)。

這裏介紹的是各個模塊,但最後把他們串聯起來,靠的是我們的自動駕駛軟件系統,這就是自動駕駛的車載系統。很多自動駕駛企業使用的是 ROS 的一套工業系統,而 Pony.ai 是從第一行代碼開始,寫了一套 PonyBrain,自研的多層次自動駕駛車載系統,最主要的做的事情有:

多模塊的調度運行,所有模塊的調度運行都是 Pony.ai 自己去做的。

模塊間的消息通信,如何把數據從激光雷達傳遞到傳感器融合的模塊,再把融合的結果放到感知模塊中,然後感知的數據怎麼告訴行為預測、決策規劃等等模塊,以及如何拿到高精地圖與定位的信息。

車載計算資源的分配與管理,對於自動駕駛來說反應速度是非常重要的,這就需要我們對內存、CPU、GPU 等有足夠的優化,做到定製化的車載計算資源分配與管理。

日誌記錄,同時我們需要完善的日誌記錄,我們所有的測試數據回來都需要一整套的 Pipeline 去做自動化的分析,然後幫我們評判出有意義的數據,給到測試工程師或者研發工程師,進行進一步的分析去使用,然後進一步提升我們的模型。

監控與報警,保證了我們自動駕駛的安全性。

車載系統的挑戰:

① 可靠性:車載系統必須足夠的可靠,不能有任何的內存泄露、代碼邏輯的錯位,這種都是零容忍的,一旦發生了這樣的事情,對整個自動駕駛系統來說是非常嚴重的事故,是有可能影響到安全性的,對於 Pony.ai 自動駕駛系統技術的發展來說,安全永遠是我們的第一位,所以所有影響安全性的事情,我們都是零容忍的,同時他也會影響車隊運營的效率;所以我們還需要系統監控與異常報警,一旦系統出現任何問題,我們需要及時提醒安全員,做出車輛接管的操作。

② 高性能:滿足模塊間通信的海量數據壓力,同時實現低延遲。

③ 靈活性:支持多種不同類型的計算資源的接入,以及不同類型模塊的接入,需要有靈活的系統來支持計算資源的高速迭代。

車載系統的實踐:

可靠性:

① 代碼質量要求高:對於可靠性來說我們有非常嚴格的 code review 和 unit test,相信這是在國內互聯網公司不太容易見到的一件事情,雖然會非常耗時,但是對可靠性的提升是有非常大的幫助的。

② 合理使用工具幫助發現問題:同時我們也會使用非常多的工具,如靜態分析、ASAN 等等,來做離線的分析,來保證系統的可靠性。

③ 多重系統可靠性檢查:包括系統啟動前校驗,系統運行時實時監控,系統運行后數據分析等。

④ 這是我們的持續集成與發布的平台:對於每一次代碼的修改,我們都會進行仿真測試;然後對於研發的迭代,我們每周會有 Release 版本的更新,保障版本的穩定性,同時,剛剛我們整個測試包括封閉,半封閉,高峰期的測試,整個測試流程怎麼持續集成與發布,也是保證系統可靠性的一種方法。

高性能:

① 合理的架構避免大數據拷貝等嚴重影響性能的邏輯。

② 依據模塊邏輯分配合適的計算資源,如內存、CPU、GPU 等。

③ 定期對整個系統 Profile 分析系統的性能瓶頸。

靈活性:

① 定義足夠通用的模塊公共接口。

② 定義足夠通用的消息通信接口。

為什麼需要仿真系統?因為仿真系統可以使得我們車還沒有上路的時候,就已經做了大規模的自動駕駛測試,無需路測和人力接入就可以評價系統的性能變化;由於沒有進行路測,不會引起路面事故;同時,仿真系統還提供了基於數據驅動快速迭代算法的可行性,新的算法可以先在仿真平台上做驗證,一些具體的指標和測試的信息都會在仿真平台上有所體現。

仿真系統數據的倆個不同來源:

① 支持真實路測收集的場景,我們的路測數據非常的多,數據回來之後,通過 Data Pipeline 自動更新這些有意義和有意思的場景,我們會根據當時的場景改動相應的模塊,然後會在仿真系統重跑當時的場景,來判斷新的方法是否 work;

② 支持人工和隨機生成的場景,這樣的一些仿真的場景,也是非常的重要的,因為雖然我們在做大規模的路測,但是不代表可以遇到所有的場景,很多場景無法在路測中收集到,這就需要我們通過人工去創造這樣的場景出來,給我們的系統一些樣本,來學習如何處理這樣的場景,保證我們新的 feature 在這樣的場景不會出現問題。

仿真平台的挑戰與實踐:

① 仿真結果的可靠性:首先仿真的結果必須是可靠的,如果不可靠,用它檢測出來的結果是沒有任何的意義的。整個仿真是在服務端模擬車載環境跑的,同時在服務端構建車輛動力學模型,保證測試的數據足夠可靠。

② 仿真數據的選擇與管理:當然我們會選擇合適的路測數據來幫助算法的迭代(這裏的選擇不是人工的選擇,是全自動化的選擇,幫我們在茫茫數據中挑選出有意義的數據);另外,我們還會規範的依據類別管理大規模的仿真數據,比如感知模塊的一些改動,到底需要測試哪些數據,才會更加的體現這個改動帶來多少影響,這裏我們會有內部的一個分類,我們不會對所有的數據進行無差別的仿真(這樣做意義不大)。

③ 仿真系統的性能:我們將整個仿真系統并行部署在分佈式計算平台中,這才可能滿足我們單天 30W 公里以上的仿真測試,並且這個數據還在不斷增長。

數據基礎架構:

數據是自動駕駛技術進步的核心驅動力,沒有數據,我們就看不到現在如此多的測試車輛在進行路測,數據本身有幾個重要的點:

① 如何存儲海量的數據,如何支持快速的訪問。

② 如何進行數據處理。

③ 如何進行數據同步,如何把不同區域、路測數據、車載數據同步到數據集中,如何讓不同辦公區的工程師都可以使用這些數據,對數據同步來說是一個很大的挑戰。

核心挑戰:

① 數據量大:我們有 PB 級別的數據,這裏只是以攝像頭為例,還包括其他傳感器數據,以及系統運作的中間數據等等。

② 數據屬性不同於互聯網數據:我們的數據由客戶端產生,有大量的傳感器數據、大量的模塊運行日誌,這與互聯網數據有本質的區別,所以對整個數據架構的要求也是不一樣的。

數據存儲的挑戰:

① 依據特定的使用場景設計合理的存儲格式的設計:以便於車載系統記錄、大規模數據分析(數據回來之後,需要有方法進行分析,找出有意義的數據)、部分數據訪問、文件系統存儲(如何高效的利用文件系統)等。

② 選擇合適的存儲系統:

針對冷/熱數據選擇不同方案

選擇高可用的存儲系統

選擇易於水平擴展,因為車輛規模是不停的在變大的,運營時間越來越長,數據的增長速度是遠超想象的,所以需要易於水平擴展的存儲系統。

控製成本,不能用過於昂貴的設備。

數據處理可以幫助收集性能指標,有 MPI(平均每次接管所需里程)、模塊運行效率、乘客舒適度體驗等,還有就是路測有趣場景的挖掘,如接管、急剎、感知算法識別、不合理的變道策略等用於模型訓練和仿真。

數據處理的挑戰:

① 減小數據採集到處理的全流程時間:如何以最快的速度把數據從車傳到中間處理系統,Data Pipeline 運行完之後,上傳到數據中心,這裏面我們做了非常多的工作。

② 依據不同類型數據處理任務選擇合適的處理系統:計算量要求比較高的我們選擇 CPU 密集型系統來處理;更多的會是車載的數據,我們會選擇 IO 密集型系統進行處理。

③ 通用的任務定義以支持靈活的添加新任務:幫我們檢測出來更多有意義的數據。

車隊運營基礎平台:

我們有一個 Pony Pilot 項目,在我們廣州所有的內部員工都可以使用,同時在北京和美國加州,也有同樣的服務已經上線,那麼支持這樣的服務,我們需要做哪些事情:

Fleet Control Center,車隊控制中心

Pony Pilot APP

Onboard system

各種各樣的 webapp,幫助我們觀察整個車隊的運營情況,幫助管理測試的車輛和人員。

車隊運營基礎平台的挑戰:

需要支持複雜需求變化的 web 框架,同時我們有大量的 web service 的部署與管理,這都需要我們去完善 web 服務通用組件,例如部署工具、日誌記錄平台隨時排查問題、監控平台保證所有 service 平台的高可容性。

容器與服務調度平台:

通過 Kubernetes 來幫我們做各種各樣的服務調度和集群支持。

可視化平台:

① 目標:方便人類理解無人車系統看到的世界

② 挑戰:首先,需要足夠的靈活,易於適配不同需求的工具;其次,需要有高性能的現實,如 3D 實時渲染的高效實現;最後,支持跨平台的可視化框架,如桌面系統、移動系統、Web 等多平台。

人機接口:

方便乘客使用的用戶界面,同時可以看到自動駕駛是如何了解世界,如何做決策,如何規劃之後的行為等等,給乘客更多的信息和信任。

總結:

① Pony.ai 的基礎架構工作包括:

傳統互聯網公司所需要解決的基礎架構挑戰。

自動駕駛技術特定的基礎架構挑戰。

② 在這裏工作你可以:

接觸自動駕駛系統的各個方面。

設計並實現滿足通用需求的單機和分佈式系統。

系統的保障自動駕駛技術的持續進步。

這是一個非常有意思的 team,裏面有很多有意思的工作,非常歡迎大家與我們一起來工作,推動整個自動駕駛的發展,謝謝大家!

歡迎關注DataFunTalk同名公眾號,收看第一手原創技術文章。

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

※台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※小三通海運與一般國際貿易有何不同?

※小三通快遞通關作業有哪些?

貫穿野生棲地 加州高鐵路段惹質疑

摘錄自2018年9月28日蘋果日報美國加州報導

美國加州高鐵動工興建以來,一直被工程延誤、造價飆升、以及市民告上法院反對計劃等事件所困擾。負責鐵路管理的加州高速鐵路局,周一就最新的南加州棕櫚谷(Palmdale)至柏本克(Burkbank)路線舉行公聽會,近百人到現場示威,對該項目潛在影響表達疑慮。

公聽會在洛杉磯郡Sun Valley進行,300多名對計劃存疑的聖費爾南多谷(San Fernando Valley)居民出席。在場的示威者向鐵路管理層,就新路線對地震斷層、野生動物過境點、地面震動、廢氣排放、貨車交通等各項影響提出質疑。一名與會者表示,簡報並未能消除她的疑慮。

當局上週透露,棕櫚谷至柏本克之間的首選路線,是原定計劃的修訂版。局方屬意這條全長38.6英里路徑,它的地下路段雖較其他版本多上25.2英里,卻是最簡單,興建最快和風險最低的選擇。

新路線將貫穿聖蓋博山(St. Gabriel Mountains)和鄰近的住宅區,並途經聖塔克拉利塔(Santa Clarita),但繞過Shadow Hills和Lake View Terrace,即原來最爭議最大的部分。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※小三通海運與一般國際貿易有何不同?

※小三通快遞通關作業有哪些?

從 Gogoro 談起,點評台灣電動車產業與政策布局

電動車大廠特斯拉(Tesla)Model 3 於 2016 年 3 月預售開始後銷售勢如破竹,首周預購量突破 32.5 萬輛,造成產業界轟動,特斯拉高層戴爾穆德‧歐康納(Diarmuid O’Connell)於阿姆斯特丹參與電動車會議時表示,這波預購熱潮正向產業界發送訊息──電動車有極大市場需求。許多市場人士認為特斯拉已經到了「iPhone 時刻」,因為就預購與首發銷售數字比較,特斯拉 Model 3 在 2 天內預購數就達 23.2 萬輛,已經逼近初代 iPhone 在 2 天內銷售 27 萬支的成績,而在汽車史上則根本沒有可以相提並論的例子。拿「iPhone 時刻」來比擬 Model 3,可看出市場 Model 3 預售成績的驚豔轉變成期待:期望像 iPhone 啟動智慧型手機取代傳統手機的浪潮,就此讓電動車躍居主流,引爆換車巨大商機。

台灣產業界也對此風潮樂觀其成,近年來台灣電子產業鏈過度仰賴蘋果供應鏈,眼看就要隨著蘋果產品市場逐漸飽和而沉淪,如今特斯拉接到大量訂單後需要量產交貨,許多產業界人士認為台灣供應鏈最擅長規模量產、降低成本,可望在電動車零組件有新供應鏈成形。   談起特斯拉、台廠與台灣供應鏈,就不禁讓人聯想起台灣電動機車品牌 Gogoro。Gogoro 總部位於林口,其電動機車零組件除了電池與 Panasonic 合作以外,多數均由台廠供應鏈供應,而眾多歐美媒體將之譽為「二輪特斯拉」,與特斯拉相提並論。不過,相對於特斯拉不僅成為全球熱門話題,也同時成為台灣產業界注目的焦點,Gogoro 近來則似乎有點在國內媒體雷達上消失。  
Gogoro 立足台灣  打響國際知名度   儘管在國內關注熱度大不如首發之前,Gogoro 在國際舞台上倒是持續發聲。2015 年 10 月時,《富比士》(Forbes)評選 2015 年全球物聯網新創企業百強(Top 100 Internet Of Things Startups For 2015),台灣只有 Gogoro 唯一一家公司上榜,且位於前十之列的第 8 名。   2015 年 12 月,各國領袖及重量級企業雲集巴黎氣候峰會(COP21),台灣受限於 COP21 為聯合國活動,未能取得觀察員身分,官方代表無法參加,只能靠民間企業為國發聲,台達電與 Gogoro 受邀氣候峰會解決方案大展,台達電展出綠建築、Gogoro 展示電動機車與換電池站。Gogoro 也受邀參加 50 國、750 位代表與會的永續創新論壇,執行長陸學森成為 60 位登上論壇分享的代表之一。   Gogoro 之所以能有機會參與巴黎峰會,前駐法大使呂慶龍也助了一臂之力,呂慶龍曾經以台灣布袋戲向法國行銷台灣而聞名,卸任前更留下「大家忘掉呂大使也沒關係,只要記得台灣,我就算成功了」的名言。呂慶龍在 2015 年 10 月時參觀 Gogoro 信義區的體驗中心,認為十分適合向歐洲發展,之後積極協助安排,在短短 2 個月內讓 Gogoro 擠進巴黎氣候高峰會。無獨有偶,特斯拉執行長馬斯克在巴黎峰會期間,身為電動車產業領袖,也於 2015 年 12 月 2 日在巴黎第一大學發表演講,探討碳排放、氣候變遷,以及停用化石燃料等議題。

 
(Source:Gogoro)   2016 年 1 月的國際消費性電子大展(CES)上,Gogoro 也再度受邀於 Panasonic 展區設攤,因而成為唯一設展於 CES 主展館的台灣企業,Gogoro 在 Panasonic 展區的「鄰居」,正是也與 Panasonic 電池合作的特斯拉,展出其 Model S 電動車,這個因緣際會,使得 Gogoro 在國際大展場合上再度與特斯拉平起平坐,落實了前一年 CES 上多家歐美科技媒體將之比擬為「二輪特斯拉」的稱譽。  
順應全球綠能潮流  善用台灣供應鏈優勢   相對於特斯拉目前的絕頂風光,Gogoro 若拿來相提並論似乎有點失色,不過其實特斯拉也並非從開始就一帆風順,兩家企業的歷程,有許多有趣的比較之處。   首先,就資金面而言,特斯拉成立於 2003 年,至 2007 年,前 4 輪募資總計募得 1.05 億美元;Gogoro 於 2011 年成立,在 2015 年 11 月 13 日完成第二輪增資募得 1.3 億美元,投資者包括合作夥伴 Panasonic,總募資額達 1.8 億美元。也就是說,Gogoro 募資的速度與金額,其實還勝過特斯拉草創初期。   台灣企業往往資本規模遠小於歐美同業,更不用提新創企業的初期資本額只是其他產業的「百分之一」,但 Gogoro 卻能逆勢而行,取得超過特斯拉初期的資本,除了身為後進者,受惠於產業風向往電動車、電動機車發展的潮流更加明顯之外,也還有其產業鏈上的因素。兩公司之後的歷程證明,善用台灣供應鏈的確有其優勢。   特斯拉研發時程相當長,2008 年 5 月時,媒體甚至戲謔的推出「特斯拉死亡倒數時鐘」,因為特斯拉當時若得不到進一步的資金就要倒閉。其第一款電動車 Roadster 於 2008 年起出貨,至 2009 年 7 月才總算為公司帶來獲利。此後,特斯拉也一直以出貨延遲聞名,Roadster 本身就延遲 9 個月交貨,Model S 延遲超過 6 個月,Model X 更延遲超過 18 個月。   相對的,陸學森最初規劃 Gogoro 研發時程要到 2018 年才推出產品,但由於台廠供應鏈成熟,設計研發速度超前,在 2015 年就正式上市,此後出貨也相對順暢,至 2016 年 3 月 1 日累計銷售突破 6,000 輛,尚未有明顯的交貨延遲現象。相較之下,特斯拉第一款產品 Roadster 當年的總出貨量則不過 2,450 輛。

 
(Source:Gogoro)   從 Gogoro 經驗來看,台灣產業能取得的資金規模與國際相當,所在產業供應鏈的成熟度高,加上特斯拉的供應鏈想像空間,並搭上全球綠能風潮,電動車、電動機車相關產業是台灣有機會發展的產業。  
政策失靈  電動車、電動機車發展陷停滯   然而,目前國內電動車、電動機車產業發展,可說「聊勝於無」,電動機車直到 Gogoro 上市後引起正反兩方熱議,使得競爭者回應,能見度才逐漸提高。如中華車為了回應 Gogoro 的威脅,電動機車車款 EM50 推出電池續航力升級版新車;又因應 Gogoro 進軍家樂福,中華車也積極透過異業結盟加速多元化布局,可說是「有競爭才有進步」。   過去政府輔導電動車產業,被稱為越扶越倒,產業界耳語,抱怨一切政策都以裕隆為優先,但裕隆研發完全失敗後,電動車政策也跟著形同停擺,許多流言直指裕隆是國內發展電動車最大障礙。至今全台電動小客車掛牌數寥寥無幾,經濟部又轉向打算改為輔導電動中大型巴士,訂下 10 年 1 萬輛目標,目前已有許多台廠在全球市場出貨電動巴士,包括中國市場在內,但業者對回流經營台灣市場都表示興趣缺缺,指出政策上綁手綁腳,在國外經營得好好的,何必回國自找麻煩。   台灣車輛密集,若積極發展電動車、電動機車,市場潛力不小,結果產業鏈卻是期待美國的特斯拉來帶動供應鏈成形,可說是相當諷刺。另一方面,因為無法以電動車、電動機車取代汽機車污染源,又制定許多不切實際的政策打壓,尤其是針對機車族,造成許多民怨。  
解決空污問題  應以減少機車排放展開布局   2016 年 1 月 3 日,台北市長柯文哲帶頭對機車宣戰,下達三大狠招,就是要打擊機車沒得商量,包括要強力執行對機車停車格收費、增加自行車道來減少機車道消滅機車行駛空間,另外輔以調降公共運輸費率的「推力與拉力」來吸引機車族放棄機車,政策一出,全台北市機車族嘩然。   柯文哲的政策並非他的創見,事實上,幾十年來,上至中央交通部,一直到各縣市交通局,整個政府的一貫政策就是將機車視為眼中釘,想盡辦法消滅。以台北市而言,前任市長郝龍斌任內,以改造機車彎的名義,實質上大量減少機車停車格,也是消滅機車的一環。為何要消滅機車?其主要的因素之一:機車是重要的都市空氣污染排放源,尤其近年來民眾關切 PM2.5 問題,機車的排放更是遭放大檢視。   消滅機車是整個國家的既定政策,柯文哲只不過是「比較白目」把這個政策公開講出來而已。但是,這些制定政策的官員,卻從未站在民眾的角度思考為何生活中非機車不可,只想著用「推力與拉力」強逼民眾繳出更多的停車費、罰款,壓縮路權,讓民眾「騎不下去」,卻不知民眾是有非騎不可的苦衷,政策無法消滅機車,只是在製造人民的痛苦。   不過,機車污染問題也是貨真價實,以台北市環保局公布的數據,有 58% 的 PM2.5 來自於本地,其中又有 35% 的 PM2.5 來自於汽機車廢氣。在全台灣約 2,000 萬輛汽機車之中,機車佔了約 1,400 萬輛,其中高污染的二行程機車雖然逐年淘汰中,但即使是四行程機車,排放廢氣中 PM2.5 所佔比率也高達 86.5%,廢氣集中在道路上,使得機車騎士本身暴露於 PM2.5 的程度遠高於平均值,以台北市而言,PM2.5 平均值 19.6 μg/m3,但是台北都會區機車族暴露的 PM2.5 平均濃度高達 161.6 μg/m3,許多機車族因此會戴上口罩,但是很不幸的,PM2.5 小到連呼吸道中的纖毛都攔不住,口罩當然也沒有辦法過濾,戴上口罩只是純粹「求心安」。

 
(Source:台北市政府環保局。製圖:科技新報)   但民眾有使用機車的實際需求,如台北市巷弄多,公車不可能鑽進每個小巷,柯文哲市長試圖用腳踏車來填補「最後一哩」,卻忘了不是每個人都與他一樣有著能「一日雙塔」的腳力,此外更有載貨需求,用腳踏車要如何滿足?除非整個交通系統有革命性的改變,譬如小型無人車普及並結合分享服務,在那之前,台灣人就是需要機車,不可能予以打壓消滅。   唯一的辦法,不是消滅機車,而是消滅機車產生的污染,若機車能多數改為電動機車,自然沒有排氣中 PM2.5 對健康的威脅,那麼政府就不需千方百計消滅機車。事實上,包括 Gogoro 在內的各電動機車廠與各級政府相關部門討論電動車、電動機車相關規範事宜時,相關官員曾表示,若電動機車真能普及取代燃油機車,「那就不用打壓機車了」。  
跳脫產業侷限  成為智慧能源試金石   Gogoro 與特斯拉最大的相同點,或許在於對自己的定義都不只是車廠。特斯拉已經逐漸顯示其發展核心為 Gigafactory,也就是定位於以鋰電池為主的能源領域,Gogoro 則自始就強調其願景為「更自主更智慧的個人能源使用方式」。   由於 Gogoro 採用換電站方式運行,現已有 177 座 GoStation 電池交換站,未來更將加速拓展新城市擴充布站據點,期望達成一公里一站的目標。若日後換電站能遍布各處,城市電網與換電站之間又能彼此聯繫智慧調控,將可在供電緊繃時減緩換電站中充飽電池的速度,在電力有餘裕的時候加速充電,以達需求反應調節的效果,更進一步,則可能利用換電站中的電池做為分散式能源儲存資源使用。

 
▲ 目前所有 GoStation 電池交換站(含興建中)的服務範圍(點選查看互動地圖)。   台灣未來積極發展綠能、智慧電網,若已有多家同樣以換電站方式運行的電動車、電動機車民間企業,建立廣布的分散式能源儲存資源,將可望節省可觀的建置時間與預算。發展電動車、電動機車產業,不僅可為供應鏈找出路,減少 PM2.5 污染問題,也能對未來先進智慧能源系統發展有所助益。   然而,台灣的發展狀態可說相當尷尬,目前國內電動機車的銷售主要由 Gogoro 帶動,3 月時 Gogoro 宣布在重點城市市佔率高達 92%,但是即使是 Gogoro,與傳統機車銷售量相比較,也還是小巫見大巫,尚未發揮取代傳統機車的作用。   而政府在各政策之間向來缺乏完整的整體思惟與彼此配套,在針對機車與污染相關政策的時候也一樣,2015 年 12 月,立院通過行政院函請審議的貨物稅條例第 12 條之 5 條文修正草案,其重點是希望以減稅優惠補貼,來促進民眾汰換 6 年以上老舊汽車或 4 年以上老舊機車,只要民眾報廢或出口符合條件的中古汽機車,可在購買新車時享貨物稅減稅優惠,汽車減 5 萬元、機車減 4 千元。   這個方案是因為行政院想以消費刺激經濟,又認為老舊汽機車排氣的空污較嚴重,因此鼓勵舊換新,單獨來看立意尚佳,但考慮到政府也正在希望推動電動車、電動機車,以更徹底的減少交通空污,政府一邊計劃發展電動車、補貼電動機車,卻又一邊補貼汽油車與機車,兩個策略的方向彼此抵消,施政可說毫無整體性可言。   過去政府對於電動車、電動機車的政策只能以「七零八落」形容,對機車則是一味打壓,訴諸「推力與拉力」,很少思考如何給機車族民眾一條替代出路;而新政府即將往綠能、智慧電網的世界潮流發展,產業界則殷殷尋求下一個供應鏈商機,這數個重大需求結合起來,若能形成跨部會政策一同推動,整合法規、政策補貼與稅制彼此配合,同時解決多個需求,將可事半功倍。反之,若還是像過去,政府各單位本位主義各自為政,你打壓你的機車,我把電動車「扶倒」,那麼將同樣一事無成。   特斯拉風風光光,台灣產業界固然羨慕,但我們不應只是對著可能的供應鏈商機流口水,而是該趁此機會,全盤檢討國家政策:當電動車來到「iPhone 時刻」,該如何跟上這股商機,並以此對國家全面性的發展有所助益?新政府與其區分「五大創新產業」,其實跨部會、跨領域、跨產業、跨議題的通盤思考,或許對高效率的施政更有幫助。  
參考資料:

(首圖來源:  CC BY 2.0)

(本文授權轉載自《》─〈〉)

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

【其他文章推薦】

※台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※小三通海運與一般國際貿易有何不同?

※小三通快遞通關作業有哪些?

PowerMock學習(三)之Mock局部變量

編寫powermock用例步驟:

  • 類上面先寫這兩個註解@RunWith(PowerMockRunner.class)、@PrepareForTest(StudentService.class)
  • 先模擬一個假對象即studentdao方法中的局部變量
  • 用無參的方式new對象
  • 再模擬這個對象被調用時,是否有返回,有返回值給出默認值,沒有用doNothing()
  • 驗證有返回值使用assertEquals即可,無返回值使用Mockito.verify驗證

實際案例

接着上一篇文章中的代碼,修改下service中的代碼,這次我不通過構造器注入Dao,在方法中new一個StudentDao,創建一個名為StudentNewService的類。

具體示例代碼如下:

package com.rongrong.powermock.service;

import com.rongrong.powermock.dao.StudentDao;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/17 21:13
 */
public class StudentNewService {


    /**
     * 獲取學生個數
     * @return返回學生總數
     */
    public int getTotal() {
        StudentDao studentDao = new StudentDao();
        return studentDao.getTotal();
    }

    /**
     * 創建學生
     * @param student
     */
    public void createStudent(Student student) {
        StudentDao studentDao = new StudentDao();
        studentDao.createStudent(student);
    }
}

針對上面修改部分代碼,進行單元測試,以下代碼有採用傳統方式測試和採用powermock方式進行測試,具體代碼如下:

package com.rongrong.powermock.service;

import com.rongrong.powermock.dao.StudentDao;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/20 21:42
 */
@RunWith(PowerMockRunner.class)
@PrepareForTest(StudentNewService.class)
public class TestNewStudentService {

    /**
     * 傳統方式測試
     */
    @Test
    public void testGetStudentTotal() {
        StudentNewService studentNewService = new StudentNewService();
        int total = studentNewService.getTotal();
        assertEquals(total, 10);
    }

    /**
     * @desc測試有返回值類型 採用powermock進行測試獲取學生個數
     */
    @Test
    public void testGetStudentTotalWithPowerMock() {
        //先模擬一個假對象即studentdao方法中的局部變量
        StudentDao studentDao = PowerMockito.mock(StudentDao.class);
        try {
            //這句話我按照英文理解就是,我用無參的方式new了一個StudentDao對象
            PowerMockito.whenNew(StudentDao.class).withNoArguments().thenReturn(studentDao);
            //再模擬這個對象被調用時,我們默認假定返回10個證明調用成功
            PowerMockito.when(studentDao.getTotal()).thenReturn(10);
            //這裏就是service就不用再說了
            StudentNewService studentNewService = new StudentNewService();
            int total = studentNewService.getTotal();
            assertEquals(total, 10);
        } catch (Exception e) {
            fail("測試失敗了!!!");
            e.printStackTrace();
        }

    }

    /**
     * @desc測試的無返回值類型 採用powermock進行測試創建學生
     */
    @Test
    public void testCreateStudentWithPowerMock() {
        //先模擬一個假對象即studentdao方法中的局部變量
        StudentDao studentDao = PowerMockito.mock(StudentDao.class);
        try {
            //這句話我按照英文理解就是,我用無參的方式new了一個StudentDao對象
            PowerMockito.whenNew(StudentDao.class).withNoArguments().thenReturn(studentDao);
            Student student = new Student();
            //這句話註釋與否都能運行通過,也就是我只能判斷他是否被調用
            //PowerMockito.doNothing().when(studentDao).createStudent(student);
            //這裏就是service就不用再說了
            StudentNewService studentNewService = new StudentNewService();
            studentNewService.createStudent(student);
            Mockito.verify(studentDao).createStudent(student);
        } catch (Exception e) {
            fail("測試失敗了!!!");
            e.printStackTrace();
        }

    }

}

運行上面的測試用例,會發現第一個失敗,後面兩個都運行成功,即有返回值和無返回值類型的測試(void類型)。

 

 

注意:對於無返回值類型的測試,只能驗證其是否被調用,這裏還請注意。

 

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

※台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※小三通海運與一般國際貿易有何不同?

※小三通快遞通關作業有哪些?

併發編程-硬件加持的CAS操作夠快么?

Talk is cheap

CAS(Compare And Swap),即比較並交換。是解決多線程并行情況下使用鎖造成性能損耗的一種機制,CAS操作包含三個操作數——內存位置(V)、預期原值(A)和新值(B)。如果內存位置的值與預期原值相匹配,那麼處理器會自動將該位置值更新為新值。否則,處理器不做任何操作。無論位置V的值是否等於A, 都將返回V原有的值。

CAS的含義是”我認為V的值應該是A,如果是,那我將V的值更新為B,否則不修改並告訴V的值實際是多少“

Show you my code

在單線程環境中分別使用無鎖,加鎖以及cas進行十組5億次累加運算,然後打印出平均耗時。

 /**
 * cas對比加鎖測試
 *
 * @author Jann Lee
 * @date 2019-11-21 0:12
 **/
public class CasTest {

    @Test
    public void test() {
        long times = 500_000_000;
        // 記錄耗時
        List<Long> elapsedTime4NoLock = new ArrayList<>(10);
        List<Long> elapsedTime4Synchronized = new ArrayList<>(10);
        List<Long> elapsedTime4ReentrantLock = new ArrayList<>(10);
        List<Long> elapsedTime4Cas = new ArrayList<>(10);

        // 進行10組試驗
        for (int j = 0; j < 10; j++) {
            // 無鎖
            long startTime = System.currentTimeMillis();
            for (long i = 0; i < times; i++) {
            }
            long endTime = System.currentTimeMillis();
            elapsedTime4NoLock.add(endTime - startTime);

            // synchronized 關鍵字(隱式鎖)
            startTime = endTime;
            for (long i = 0; i < times; ) {
                i = addWithSynchronized(i);
            }
            endTime = System.currentTimeMillis();
            elapsedTime4Synchronized.add(endTime - startTime);

            // ReentrantLock 顯式鎖
            startTime = endTime;
            ReentrantLock lock = new ReentrantLock();
            for (long i = 0; i < times; ) {
                i = addWithReentrantLock(i, lock);
            }
            endTime = System.currentTimeMillis();
            elapsedTime4ReentrantLock.add(endTime - startTime);

            // cas(AtomicLong底層是用cas實現)
            startTime = endTime;
            AtomicLong atomicLong = new AtomicLong();
            while (atomicLong.getAndIncrement() < times) {
            }
            endTime = System.currentTimeMillis();
            elapsedTime4Cas.add(endTime - startTime);
        }

        System.out.println("無鎖計算耗時: " + average(elapsedTime4NoLock) + "ms");
        System.out.println("synchronized計算耗時: " + average(elapsedTime4Synchronized) + "ms");
        System.out.println("ReentrantLock計算耗時: " + average(elapsedTime4ReentrantLock) + "ms");
        System.out.println("cas計算耗時: " + average(elapsedTime4Cas) + "ms");

    }

    /**
     * synchronized加鎖
     */
    private synchronized long addWithSynchronized(long i) {
        i = i + 1;
        return i;
    }

    /**
     * ReentrantLock加鎖
     */
    private long addWithReentrantLock(long i, Lock lock) {
        lock.lock();
        i = i + 1;
        lock.unlock();
        return i;
    }

    /**
     * 計算平均耗時
     */
    private double average(Collection<Long> collection) {
        return collection.stream().mapToLong(i -> i).average().orElse(0);
    }
}

從案例中我們可能看出在單線程環境場景下cas的性能要高於鎖相關的操作。當然,在競爭比較激烈的情況下性能可能會有所下降,因為要不斷的重試和回退或者放棄操作,這也是CAS的一個缺點所在,因為這些重試,回退等操作通常用開發者來實現。

CAS的實現並非是簡單的代碼層面控制的,而是需要硬件的支持,因此在不同的體系架構之間執行的性能差異很大。但是一個很管用的經驗法則是:在大多數處理器上,在無競爭的鎖獲取和釋放的”快速代碼路徑“上的開銷,大約是CAS開銷的兩倍。

為何CAS如此優秀

硬件加持,現代大多數處理器都從硬件層面通過一些列指令實現CompareAndSwap(比較並交換)同步原語,進而使操作系統和JVM可以直接使用這些指令實現鎖和併發的數據結構。我們可以簡單認為,CAS是將比較和交換合成是一個原子操作。

JVM對CAS的支持, 由於Java程序運行在JVM上,所以應對不同的硬件體系架構的處理則需要JVM來實現。在不支持CAS操作的硬件上,jvm將使用自旋鎖來實現。

CAS的ABA問題

cas操作讓我們減少了鎖帶來的性能損耗,同時也給我們帶來了新的麻煩-ABA問題。

在線程A讀取到x的值與執行CAS操作期間,線程B對x執行了兩次修改,x的值從100變成200,然後再從200變回100;而後在線程A執行CAS操作過程中並未發現x發生過變化,成功修改了x的值。由於x的值100 ->200->100,所以稱之為ABA的原因。

魔高一尺道高一丈,解決ABA的問題目前最常用的辦法就是給數據加上“版本號”,每次修改數據時同時改變版本號即可。

Q&A

在競爭比較激烈的情況下,CAS要進行回退,重試等操作才能得到正確的結果,那麼CAS一定比加鎖性能要高嗎?

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※小三通海運與一般國際貿易有何不同?

※小三通快遞通關作業有哪些?

哈雷五年內推出電動機車

經典重型機車品牌哈雷終於將正式邁向電動車行列?媒體報導,哈雷高級副總裁Sean Cumming在受訪時透漏,哈雷將在五年內推出一款貨真價實的哈雷電動機車。

《癮科技》報導哈雷曾在2014年以Project LiveWire為名推出一款電動機車原型車,行駛續航力只有96公里左右;續航力差強人意的原因是,為了兼顧車體的美觀而無法安裝體積過於龐大的電池。

Sean Cumming在受訪時表示,公司會在五年內推出電動機車,但並未透漏更多細節。由於哈雷機車車體較大,或許就能安裝電容量更大的電池;未來電池的能量密度也會更高,續航力問題也許能獲得解決。

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

【其他文章推薦】

※台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

※小三通海運與一般國際貿易有何不同?

※小三通快遞通關作業有哪些?