智利森林大火延燒 120棟房屋付之一炬

摘錄自2019年12月25日中央社報導

智利官員表示,瓦巴萊索市(Valparaiso)森林大火迅速蔓延,至少燒毀120棟房屋,使當地居民大規模疏散。

瓦巴萊索市內所有消防員都被派至羅庫安特(Rocuant)和聖魯克(San Roque)地區,以撲滅當地火勢。此外,當局切斷該區9萬用戶的電力供應,作為預防措施。

英國廣播公司(BBC)與美國廣播公司新聞(ABC News)報導,瓦巴萊索市長夏普(Jorge Sharp)告訴24 Horas新聞頻道,火災起燃「有跡可循」。目前尚無人員死傷通報。

智利農業部長華克(Antonio Walker)隨後抵達災區。他承認,消防隊員難以控制火勢。

已有近120公頃的草原遭大火焚毀。

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

【其他文章推薦】

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

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

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

南投搬家前需注意的眉眉角角,別等搬了再說!

5種常見Bean映射工具的性能比對

本文由 JavaGuide 翻譯自 https://www.baeldung.com/java-performance-mapping-frameworks 。轉載請註明原文地址以及翻譯作者。

1. 介紹

創建由多個層組成的大型 Java 應用程序需要使用多種領域模型,如持久化模型、領域模型或者所謂的 DTO。為不同的應用程序層使用多個模型將要求我們提供 bean 之間的映射方法。手動執行此操作可以快速創建大量樣板代碼並消耗大量時間。幸運的是,Java 有多個對象映射框架。在本教程中,我們將比較最流行的 Java 映射框架的性能。

綜合日常使用情況和相關測試數據,個人感覺 MapStruct、ModelMapper 這兩個 Bean 映射框架是最佳選擇。

2. 常見 Bean 映射框架概覽

2.1. Dozer

Dozer 是一個映射框架,它使用遞歸將數據從一個對象複製到另一個對象。框架不僅能夠在 bean 之間複製屬性,還能夠在不同類型之間自動轉換。

要使用 Dozer 框架,我們需要添加這樣的依賴到我們的項目:

<dependency>
    <groupId>net.sf.dozer</groupId>
    <artifactId>dozer</artifactId>
    <version>5.5.1</version>
</dependency>

更多關於 Dozer 的內容可以在官方文檔中找到: http://dozer.sourceforge.net/documentation/gettingstarted.html ,或者你也可以閱讀這篇文章:https://www.baeldung.com/dozer 。

2.2. Orika

Orika 是一個 bean 到 bean 的映射框架,它遞歸地將數據從一個對象複製到另一個對象。

Orika 的工作原理與 Dozer 相似。兩者之間的主要區別是 Orika 使用字節碼生成。這允許以最小的開銷生成更快的映射器。

要使用 Orika 框架,我們需要添加這樣的依賴到我們的項目:

<dependency>
    <groupId>ma.glasnost.orika</groupId>
    <artifactId>orika-core</artifactId>
    <version>1.5.2</version>
</dependency>

更多關於 Orika 的內容可以在官方文檔中找到:https://orika-mapper.github.io/orika-docs/,或者你也可以閱讀這篇文章:https://www.baeldung.com/orika-mapping。

2.3. MapStruct

MapStruct 是一個自動生成 bean mapper 類的代碼生成器。MapStruct 還能夠在不同的數據類型之間進行轉換。Github 地址:https://github.com/mapstruct/mapstruct。

要使用 MapStruct 框架,我們需要添加這樣的依賴到我們的項目:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.2.0.Final</version>
</dependency>

更多關於 MapStruct 的內容可以在官方文檔中找到:https://mapstruct.org/,或者你也可以閱讀這篇文章:https://www.baeldung.com/mapstruct。

要使用 MapStruct 框架,我們需要添加這樣的依賴到我們的項目:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.2.0.Final</version>
</dependency>

2.4. ModelMapper

ModelMapper 是一個旨在簡化對象映射的框架,它根據約定確定對象之間的映射方式。它提供了類型安全的和重構安全的 API。

更多關於 ModelMapper 的內容可以在官方文檔中找到:http://modelmapper.org/ 。

要使用 ModelMapper 框架,我們需要添加這樣的依賴到我們的項目:

<dependency>
  <groupId>org.modelmapper</groupId>
  <artifactId>modelmapper</artifactId>
  <version>1.1.0</version>
</dependency>

2.5. JMapper

JMapper 是一個映射框架,旨在提供易於使用的、高性能的 Java bean 之間的映射。該框架旨在使用註釋和關係映射應用 DRY 原則。該框架允許不同的配置方式:基於註釋、XML 或基於 api。

更多關於 JMapper 的內容可以在官方文檔中找到:https://github.com/jmapper-framework/jmapper-core/wiki。

要使用 JMapper 框架,我們需要添加這樣的依賴到我們的項目:

<dependency>
    <groupId>com.googlecode.jmapper-framework</groupId>
    <artifactId>jmapper-core</artifactId>
    <version>1.6.0.1</version>
</dependency>

3.測試模型

為了能夠正確地測試映射,我們需要有一個源和目標模型。我們已經創建了兩個測試模型。

第一個是一個只有一個字符串字段的簡單 POJO,它允許我們在更簡單的情況下比較框架,並檢查如果我們使用更複雜的 bean 是否會發生任何變化。

簡單的源模型如下:

public class SourceCode {
    String code;
    // getter and setter
}

它的目標也很相似:

public class DestinationCode {
    String code;
    // getter and setter
}

源 bean 的實際示例如下:

public class SourceOrder {
    private String orderFinishDate;
    private PaymentType paymentType;
    private Discount discount;
    private DeliveryData deliveryData;
    private User orderingUser;
    private List<Product> orderedProducts;
    private Shop offeringShop;
    private int orderId;
    private OrderStatus status;
    private LocalDate orderDate;
    // standard getters and setters
}

目標類如下圖所示:

public class Order {
    private User orderingUser;
    private List<Product> orderedProducts;
    private OrderStatus orderStatus;
    private LocalDate orderDate;
    private LocalDate orderFinishDate;
    private PaymentType paymentType;
    private Discount discount;
    private int shopId;
    private DeliveryData deliveryData;
    private Shop offeringShop;
    // standard getters and setters
}

整個模型結構可以在這裏找到:https://github.com/eugenp/tutorials/tree/master/performance-tests/src/main/java/com/baeldung/performancetests/model/source。

4. 轉換器

為了簡化測試設置的設計,我們創建了如下所示的轉換器接口:

public interface Converter {
    Order convert(SourceOrder sourceOrder);
    DestinationCode convert(SourceCode sourceCode);
}

我們所有的自定義映射器都將實現這個接口。

4.1. OrikaConverter

Orika 支持完整的 API 實現,這大大簡化了 mapper 的創建:

public class OrikaConverter implements Converter{
    private MapperFacade mapperFacade;

    public OrikaConverter() {
        MapperFactory mapperFactory = new DefaultMapperFactory
          .Builder().build();

        mapperFactory.classMap(Order.class, SourceOrder.class)
          .field("orderStatus", "status").byDefault().register();
        mapperFacade = mapperFactory.getMapperFacade();
    }

    @Override
    public Order convert(SourceOrder sourceOrder) {
        return mapperFacade.map(sourceOrder, Order.class);
    }

    @Override
    public DestinationCode convert(SourceCode sourceCode) {
        return mapperFacade.map(sourceCode, DestinationCode.class);
    }
}

4.2. DozerConverter

Dozer 需要 XML 映射文件,有以下幾個部分:

<mappings xmlns="http://dozer.sourceforge.net"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://dozer.sourceforge.net
  http://dozer.sourceforge.net/schema/beanmapping.xsd">

    <mapping>
        <class-a>com.baeldung.performancetests.model.source.SourceOrder</class-a>
        <class-b>com.baeldung.performancetests.model.destination.Order</class-b>
        <field>
            <a>status</a>
            <b>orderStatus</b>
        </field>
    </mapping>
    <mapping>
        <class-a>com.baeldung.performancetests.model.source.SourceCode</class-a>
        <class-b>com.baeldung.performancetests.model.destination.DestinationCode</class-b>
    </mapping>
</mappings>

定義了 XML 映射后,我們可以從代碼中使用它:

public class DozerConverter implements Converter {
    private final Mapper mapper;

    public DozerConverter() {
        DozerBeanMapper mapper = new DozerBeanMapper();
        mapper.addMapping(
          DozerConverter.class.getResourceAsStream("/dozer-mapping.xml"));
        this.mapper = mapper;
    }

    @Override
    public Order convert(SourceOrder sourceOrder) {
        return mapper.map(sourceOrder,Order.class);
    }

    @Override
    public DestinationCode convert(SourceCode sourceCode) {
        return mapper.map(sourceCode, DestinationCode.class);
    }
}

4.3. MapStructConverter

Map 結構的定義非常簡單,因為它完全基於代碼生成:

@Mapper
public interface MapStructConverter extends Converter {
    MapStructConverter MAPPER = Mappers.getMapper(MapStructConverter.class);

    @Mapping(source = "status", target = "orderStatus")
    @Override
    Order convert(SourceOrder sourceOrder);

    @Override
    DestinationCode convert(SourceCode sourceCode);
}

4.4. JMapperConverter

JMapperConverter 需要做更多的工作。接口實現后:

public class JMapperConverter implements Converter {
    JMapper realLifeMapper;
    JMapper simpleMapper;

    public JMapperConverter() {
        JMapperAPI api = new JMapperAPI()
          .add(JMapperAPI.mappedClass(Order.class));
        realLifeMapper = new JMapper(Order.class, SourceOrder.class, api);
        JMapperAPI simpleApi = new JMapperAPI()
          .add(JMapperAPI.mappedClass(DestinationCode.class));
        simpleMapper = new JMapper(
          DestinationCode.class, SourceCode.class, simpleApi);
    }

    @Override
    public Order convert(SourceOrder sourceOrder) {
        return (Order) realLifeMapper.getDestination(sourceOrder);
    }

    @Override
    public DestinationCode convert(SourceCode sourceCode) {
        return (DestinationCode) simpleMapper.getDestination(sourceCode);
    }
}

我們還需要向目標類的每個字段添加@JMap註釋。此外,JMapper 不能在 enum 類型之間轉換,它需要我們創建自定義映射函數:

@JMapConversion(from = "paymentType", to = "paymentType")
public PaymentType conversion(com.baeldung.performancetests.model.source.PaymentType type) {
    PaymentType paymentType = null;
    switch(type) {
        case CARD:
            paymentType = PaymentType.CARD;
            break;

        case CASH:
            paymentType = PaymentType.CASH;
            break;

        case TRANSFER:
            paymentType = PaymentType.TRANSFER;
            break;
    }
    return paymentType;
}

4.5. ModelMapperConverter

ModelMapperConverter 只需要提供我們想要映射的類:

public class ModelMapperConverter implements Converter {
    private ModelMapper modelMapper;

    public ModelMapperConverter() {
        modelMapper = new ModelMapper();
    }

    @Override
    public Order convert(SourceOrder sourceOrder) {
       return modelMapper.map(sourceOrder, Order.class);
    }

    @Override
    public DestinationCode convert(SourceCode sourceCode) {
        return modelMapper.map(sourceCode, DestinationCode.class);
    }
}

5. 簡單的模型測試

對於性能測試,我們可以使用 Java Microbenchmark Harness,關於如何使用它的更多信息可以在 這篇文章:https://www.baeldung.com/java-microbenchmark-harness 中找到。

我們為每個轉換器創建了一個單獨的基準測試,並將基準測試模式指定為 Mode.All。

5.1. 平均時間

對於平均運行時間,JMH 返回以下結果(越少越好):

這個基準測試清楚地表明,MapStruct 和 JMapper 都有最佳的平均工作時間。

5.2. 吞吐量

在這種模式下,基準測試返回每秒的操作數。我們收到以下結果(越多越好):

在吞吐量模式中,MapStruct 是測試框架中最快的,JMapper 緊隨其後。

5.3. SingleShotTime

這種模式允許測量單個操作從開始到結束的時間。基準給出了以下結果(越少越好):

這裏,我們看到 JMapper 返回的結果比 MapStruct 好得多。

5.4. 採樣時間

這種模式允許對每個操作的時間進行採樣。三個不同百分位數的結果如下:

所有的基準測試都表明,根據場景的不同,MapStruct 和 JMapper 都是不錯的選擇,儘管 MapStruct 對 SingleShotTime 給出的結果要差得多。

6. 真實模型測試

對於性能測試,我們可以使用 Java Microbenchmark Harness,關於如何使用它的更多信息可以在 這篇文章:https://www.baeldung.com/java-microbenchmark-harness 中找到。

我們為每個轉換器創建了一個單獨的基準測試,並將基準測試模式指定為 Mode.All。

6.1. 平均時間

JMH 返回以下平均運行時間結果(越少越好):

該基準清楚地表明,MapStruct 和 JMapper 均具有最佳的平均工作時間。

6.2. 吞吐量

在這種模式下,基準測試返回每秒的操作數。我們收到以下結果(越多越好):

在吞吐量模式中,MapStruct 是測試框架中最快的,JMapper 緊隨其後。

6.3. SingleShotTime

這種模式允許測量單個操作從開始到結束的時間。基準給出了以下結果(越少越好):

6.4. 採樣時間

這種模式允許對每個操作的時間進行採樣。三個不同百分位數的結果如下:

儘管簡單示例和實際示例的確切結果明顯不同,但是它們的趨勢相同。在哪種算法最快和哪種算法最慢方面,兩個示例都給出了相似的結果。

6.5. 結論

根據我們在本節中執行的真實模型測試,我們可以看出,最佳性能顯然屬於 MapStruct。在相同的測試中,我們看到 Dozer 始終位於結果表的底部。

7. 總結

在這篇文章中,我們已經進行了五個流行的 Java Bean 映射框架性能測試:ModelMapper MapStruct Orika ,Dozer, JMapper。

示例代碼地址:https://github.com/eugenp/tutorials/tree/master/performance-tests。

開源項目推薦

作者的其他開源項目推薦:

  1. :【Java學習+面試指南】 一份涵蓋大部分Java程序員所需要掌握的核心知識。
  2. : 適合新手入門以及有經驗的開發人員查閱的 Spring Boot 教程(業餘時間維護中,歡迎一起維護)。
  3. : 我覺得技術人員應該有的一些好習慣!
  4. :從零入門 !Spring Security With JWT(含權限驗證)後端部分代碼。

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

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

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

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

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

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

採礦業進駐 污染環境 阿根廷紅酒區爆水資源戰

摘錄自2019年12月25日明報報導

拉丁美洲最大葡萄酒產區、阿根廷門多薩省(Mendoza)爆發當地史上最大規模的示威,抗議省政府為擴大財源,修訂《水資源保護法》,容許使用大量水資源的採礦業進駐當地,並可在開採過程中使用氰化物和硫酸等有害物質,恐令當地水源受污染,並加劇旱情,損害葡萄種植戶、酒廠等的生計。

《水資源保護法》於2007年制定,限制省內的採礦過程中使用危險化學品,並禁止大量用水的採擴項目,以免影響環境。惟門多薩省議會上周五(20日)以大比數通過修例,批准省內的採礦活動使用氰化物、硫酸及其他有害化學物質。

省長蘇亞雷斯周日(22日)宣布已有19個開採鈾、銅、金、鉛、銀、鋅、鐵礦項目等待議會批准,進一步激起民憤。

省環境部長明戈蘭塞聲稱水資源不會因新政策受損,也不會對環境構成任何負面影響,強調環保糾察將規管省內每一個採礦項目對環境的影響,且將在礦場所在地辦公開聽證會。阿根廷新任總統費爾南德斯(Alberto Fernandez)表示支持礦業項目,認為對阿根廷從長期的經濟困境中復蘇至關重要。

千計群眾周一(23日)再次遊行到省府門多薩市的省長辦公室外抗議,高叫「別動水源」和修例違憲等。這場門多薩省史上最大型示威演變成警民衝突。憤怒的示威者向現場防暴警員擲石,遭警方動用橡膠子彈與催淚彈驅散。

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

【其他文章推薦】

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

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

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

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

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

氣候小尖兵 哥倫比亞10歲少年進國會發言

摘錄自2019年12月26日公共電視報導

哥倫比亞一位10歲少年法蘭西斯柯維拉進國會發言,要求立法人士重視氣候變遷議題,自己也帶頭上街疾呼。

西斯柯維拉領軍,帶著十多位孩童走上街頭,他們的訴求是,希望大家對環境議題投入更多關注、落實氣候變遷政策。儘管人數很少,但因為都是小孩子,特別引人注意。他說,「沒有B計畫,就如同我所說,這是宇宙中我們唯一擁有永續生命的星球。」

維拉認為教育很重要,地球環境相關議題應該要從教育著手;他提出看法、號召,並採取行動,跟著名瑞典環保運動者童貝里相似,而維拉也的確吸引到大人的關注。

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

【其他文章推薦】

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

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

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

南投搬家前需注意的眉眉角角,別等搬了再說!

通用汽車與 Lyft 合作,無人計程車上路測試

未來一年內,通用汽車(General Motors,GM)將與 Lyft 合作,在一般道路上測試無人駕駛的最新款電動車  Chevrolet Bolt,並計畫以此車款成為叫車服務的車隊主力。通用汽車近期正試圖整合幾筆投資,以迎接矽谷科技巨頭對傳統汽車行業的挑戰,包含 Tesla 的電動車、Google 的自動駕駛以及 Uber 的分享出租服務。   根據《華爾街日報》報導,今年 1 月通用汽車曾投資 Lyft 高達 5 億美元,並以 10 億美元價格收購了位於舊金山的自動駕駛技術開發商 Cruise Automation,預期接下來的服務將仰賴該公司技術。   通用汽車與 Lyft 的合作主要針對 Google 和 Uber 而來。Google 的自動駕駛汽車技術目前遙遙領先,即便與福特汽車合作告吹,他們也順利另外和飛雅特─克萊斯勒(Fiat Chrysler)成功聯手。而作為 Lyft 難以撼動的競爭對手,Uber 也在匹茲堡成立了無人駕駛研究中心,並計劃於 2020 年將無人駕駛車投入車隊營運。   Lyft 高層表示,關於無人計程車測試的細節仍在研究當中,不過這一項測試將在某些城市供用戶參與。Lyft 目前擁有一款原型的智慧型手機應用,用戶藉此透過 Lyft 叫車,可以選擇是否由無人駕駛車前來接送。在發生問題時,用戶也可以聯繫通用汽車 OnStar 系統助理請求協助。這款應用還支援讓用戶指示車輛何時出發,以及車輛是否已達到目的地可以離開。   目前有加州、密西根州、內華達州、佛羅里達州與華盛頓特區等地通過無人駕駛車上路測試的相關法案,Google 則已經在這些地區以外的其他城市,包含奧斯汀、鳳凰城與華盛頓州的柯克蘭進行他們的自動駕駛車測試。這也意味著通用汽車和 Lyft 同樣可以選擇在某些立法未詳的州以實行他們的計畫。Lyft 和 Uber 高層之前都曾表示,無人駕駛車的主要障礙來自於監管法規如何適用於這類車輛,以及責任歸屬如何界定。為了解決監管問題,Lyft 最初仍會在無人駕駛車上配備司機,以在必要情況下進行人工介入。   除了無人駕駛車外,通用汽車最重要的如意算盤,就是讓 Lyft 及其司機團隊成為 Chevrolet Bolt 的主要客戶。這款電動車將於 2016 年底上市。目前通用汽車和 Lyft 在芝加哥將 Chevrolet Equinox 租給有需要的司機駕駛,而未來的主力車型將會是 Bolt,而不是作為 SUV 的 Equinox。   Bolt 比上一款 Chevrolet Volt 能儲存更多電力,續航力更強;電池位於車身底盤,因此車輛前半部多出了空間,讓後排乘客的腿部空間更大。通用汽車表示,這款車型非常適合需要更多空間,同時希望降低運營成本的司機。

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

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

【其他文章推薦】

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

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

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

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

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

開賣!裕隆純電動車明年打進中國市場

因應大陸明年起針對汽車廠實施能耗總量管制(Corporate Average Fuel Consumption,CAFC)新措施,裕隆集團啟動新能源車登陸計畫。裕隆總經理姚振祥 27 日宣布,明年將在大陸投產首款納智捷純電動車 S5 EV+。   裕隆、中華車高層均示警,大陸 CAFC 的實施,至 2020 年要實現出廠新車平均每公升行駛 20 公里的超低油耗水準,大陸車廠將掀淘汰潮。法人看好 CAFC 上路,大陸低價車、低技術能量車廠將陸續遭淘汰空出市場,裕隆集團大陸事業將受惠,後市看多。   裕隆集團看好今年兩岸車市規模均將較去年小幅成長,台灣預估將達 42 萬輛的近 10 年新高,大陸可望成長至 2,513 萬輛新高。在車市看增,加上全球經濟成長審慎樂觀下,裕隆三寶今年兩岸均訂下新車銷量成長的目標。

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

【其他文章推薦】

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

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

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

南投搬家前需注意的眉眉角角,別等搬了再說!

Flink中異步AsyncIO的實現 (源碼分析)

先上張圖整體了解Flink中的異步io

 

阿里貢獻給flink的,優點就不說了嘛,官網上都有,就是寫庫不會柱塞性能更好

然後來看一下, Flink 中異步io主要分為兩種

  一種是有序Ordered

  一種是無序UNordered

主要區別是往下游output的順序(注意這裏順序不是寫庫的順序既然都異步了寫庫的順序自然是無法保證的),有序的會按接收的順序繼續往下游output發送,無序就是誰先處理完誰就先往下游發送

兩張圖了解這兩種模式的實現

 

有序:record數據會通過異步線程寫庫,Emitter是一個守護進程,會不停的拉取queue頭部的數據,如果頭部的數據異步寫庫完成,Emitter將頭數據往下游發送,如果頭元素還沒有異步寫庫完成,柱塞      

無序:record數據會通過異步線程寫庫,這裡有兩個queue,一開始放在uncompleteedQueue,當哪個record異步寫庫成功后就直接放到completedQueue中,Emitter是一個守護進程,completedQueue只要有數據,會不停的拉取queue數據往下游發送 

    

可以看到原理還是很簡單的,兩句話就總結完了,就是利用queue和java的異步線程,現在來看下源碼

這裏AsyncIO在Flink中被設計成operator中的一種,自然去OneInputStreamOperator的實現類中去找

於是來看一下AsyncWaitOperator.java

  

看到它的open方法(open方法會在taskmanager啟動job的時候全部統一調用,可以翻一下以前的文章)

這裏啟動了一個守護線程Emitter,來看下線程具體做了什麼

 

 1處拉取數據,2處就是常規的將拉取到的數據往下游emit,Emitter拉取數據,這裏先不講因為分為有序的和無序的

 這裏已經知道了這個Emitter的作用是循環的拉取數據往下游發送

 回到AsyncWaitOperator.java在它的open方法初始化了Emitter,那它是如何處理接收到的數據的呢,看它的ProcessElement()方法

 

    

 

 其實主要就是三個個方法

先是!!!將record封裝成了一個包裝類StreamRecordQueueEntry,主要是這個包裝類的構造方法中,創建了一個CompleteableFuture(這個的complete方法其實會等到用戶代碼執行的時候用戶自己決定什麼時候完成)

1處主要就是講元素加入到了對應的queue,這裏也分為兩種有序和無序的

 

這裏也先不講這兩種模式加入數據的區別

接着2處就是調用用戶的代碼了,來看看官網的異步io的例子

 

 給了一個Future作為參數,用戶自己起了一個線程(這裏思考一下就知道了為什麼要新起一個異步線程去執行,因為如果不起線程的話,那processElement方法就柱塞了,無法異步了)去寫庫讀庫等,然後調用了這個參數的complete方法(也就是前面那個包裝類中的CompleteableFuture)並且傳入了一個結果

看下complete方法源碼

 

 這個resultFuture是每個record的包裝類StreamRecordQueueEntry的其中一個屬性是一個CompletableFuture

 那現在就清楚了,用戶代碼在自己新起的線程中當自己的邏輯執行完以後會使這個異步線程結束,並輸入一個結果

 那這個幹嘛用的呢

 

最開始的圖中看到有序和無序實現原理,有序用一個queue,無序用兩個queue分別就對應了

OrderedStreamElementQueue類中

 

 UnorderedStreamElementQueue類中

 

回到前面有兩個地方沒有細講,一是兩種模式的Emitter是如何拉取數據的,二是兩種模式下數據是如何加入OrderedStreamElementQueue的

有序模式:

1.先來看一下有序模式的,Emitter的數據拉取,和數據的加入

    其tryPut()方法

      

      

     onComplete方法

       

       onCompleteHandler方法

        

  這裏比較繞,先將接收的數據加入queue中,然後onComplete()中當上一個異步線程getFuture() 其實就是每個元素包裝類裏面的那個CompletableFuture,當他結束時(會在用戶方法用戶調用complete時結束)異步調用傳入的對象的 accept方法,accept方法中調用了onCompleteHandler()方法,onCompleteHandler方法中會判斷queue是否為空,以及queue的頭元素是否完成了用戶的異步方法,當完成的時候,就會將headIsCompleted這個對象signalAll()喚醒

 

2.接着看有序模式Emitter的拉取數據

       

   這裡有序方式拉取數據的邏輯很清晰,如果為空或者頭元素沒有完成用戶的異步方法,headIsCompleted這個對象會wait住(上面可以知道,當加入元素的到queue且頭元素完成異步方法的時候會signalAll())然後將頭數據返回,往下游發送

 

這樣就實現了有序發送,因為Emitter只拉取頭元素且已經完成用戶異步方法的頭元素

 

無序模式: 

  這裏和有序模式就大同小異了,只是變成了,接收數據后直接加入uncompletedQueue,當數據完成異步方法的時候就,放到completedQueue裏面去並signalAll(),只要completedqueue裏面有數據,Emitter就拉取往下發

 

這樣就實現了無序模式,也就是異步寫入誰先處理完就直接放到完成隊列裏面去,然後往下發,不用管接收數據的順序

 

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

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

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

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

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

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

讀《阿里工程師的自我修養》我學到這幾點

 

 

一個月之前瀏覽博客園時發現了這本《阿里工程師的自我修養》,被裡面的其中一個叫做時間管理三八理論吸引到。花了兩個星期看完這本書。看完之後覺得有種豁然開朗的感覺,恰逢自己工作兩年,結合自己兩年以來的工作感受認真思索書中所講到的經驗,覺得有一些內容還是值得記錄下來的。於是趁這個機會總結一下書里我覺得精華的內容,對自己的兩年工作做一個回顧總結,同時按照書中所介紹的一些技巧升級自己的技能。

 

結構化思維

結構化思維 = 邏輯 + 套路

邏輯

四種組織思想的邏輯關係:

1. 因果順序: 大前提,小前提,結論。

2. 步驟順序:第一、第二、第三。首先、然後,再者,最後等。

3. 結構順序:前端,後端,數據。中國,美國,瑞士等。化整為零。

4. 程度順序:最重要,次重要,不重要。

實際上,所有的邏輯關係都在這四種順序之內,只要我們的思想和表達在這四種邏輯順序之內,就是有邏輯的,否則就會顯得沒有邏輯性。

套路

套路是指我們解決問題的方法論。使用合適的方法去解決遇到的問題。如
SWOT分析法
麥肯錫7步分析法
金字塔原理
5w2h分析法

結構化思考的方式:

 1. 建立中心目標
 2. 結構化分析
確定完中心之後,我們需要構建一個結構,使用結構化的思維對問題進行分解。分解的策略就是我們上文提到的四種邏輯順序,即演繹順序,時間順序,空間順序和程度順序。

做分解的時要滿足 MECE原則,即相互獨立,完全窮盡。

個人感悟:

想要提高自己的能力,需要懂得一些解決問題的套路。我一直以為套路就是一種經驗,面對難題時先如何,再如何,分幾步走,做到自己心中有數,這就是套路。一個初出茅廬的學生可以做事毫無頭緒,但作為一個工作兩年的老鳥,做事應該有一些最基本的套路,哪怕是一個最簡單的先搞清楚問題是什麼再動手,這也是一個好套路。做一個開發,需要做的是先思考再寫代碼。面對一個新的功能時思考設計的時間不應該低於20%,思考的時間越多bug越少。

 

如何在工作中快速成長,致工程師的10個技巧

時間管理三八理論

每個人每天公平的擁有24個小時,第一個8小時用於睡覺;第二個8小時用於工作;第三個8小時用於自由支配。
人與人的差距主要由第三個8小時決定的。第三個8小時用於消費,交易還是投資有着非常大的人生差別。

個人感悟:

記得有人說過體現一個人差距的是工作之後的時間。利用工作之餘時間繼續學習的人一定能夠成長的更快。目前所在的工作單位是事業單位的編製,朝九晚五的工作時間讓我覺得這不是程序員該有的工作節奏,所以更應該珍惜好業餘的時間多學習東西才能不遊走於技術的海平面以下。”力盡不知熱 但惜夏日長“,這是我的微信簽名,出至於白居易的《觀刈麥》,农民在炎熱的夏天割麥子精疲力竭但不覺酷熱,只是珍惜夏日天長。我又何嘗不是一個IT农民工呢?每天超長待機寫代碼寫到暈沉沉,還怕自己沒有學到東西。夏天真的好快就過去了,秋天轉眼就在眼前。沒有在夏天珍惜時間,秋天註定不會有收穫。

 

貴人相助

很多時候我們會覺得身邊缺少貴人,或者貴人離自己太遠。產生這種認知離不開4個方面:

1. 自己不自信,不相信自己能夠影響他人,導致缺乏主要溝通,長期溝通。

2. 自己心態問題,自己的心態若不夠积極正向,沒有貴人敢進入你的思維空間,因為價值不匹配,很難形成認知共識。

3. 職場原因,很多時候可能你的老闆就是你的貴人,但是因為職場,因為上下級,礙於面子,礙於共組,不敢多交流,多請教。

4. 貴人來了又走了,有貴人幫你改變,但是你自己不努力,抱着過去做事的心態和方法在職場上浪跡天涯,進步不明顯,否定了他作為貴人的價值和意義。

你求助時被人之所以願意幫你,是因為他已經看到了你的價值,這種價值幫助他確定了自己的價值,或者未來你可以幫助他。

 

個人感悟:

是否在生活中遇到過貴人呢?在這一點上我覺得我還是遇到過的,讀大學時遇到一個打球好又有耐心的球友,後來跟着他學習了兩年,球技有明顯的提高。現在想想別人為什麼願意教我打球呢?第一是因為我對打球有熱情有興趣,第二我按照他交給我的技巧打球水平有明顯的提升。後來他覺的自己有教球方面的經驗就去開了一個球館。所以說貴人幫助可能是一個互利的過程。個人覺得遇到貴人不是一件很難的事情,如果你不是一個羞澀的人。在某一方面上能夠幫助到你,對於大部分人來說還是願意幫你的,只要你態度謙虛,沒有什麼原則上問題。

 

如果我是一線主管

主管大部分時間都很忙,這就要求下屬在向上管理的時候尤其要注意高效,有質量的溝通。如果我是一線主管,我更希望團隊和我交流的方式是讓我做選擇題、判斷題,而不是問答題,思考題。
如果我是一線主管,我希望下屬這樣幫助我:

1. 主動承擔團隊面臨的挑戰,給出合理的解決方案

2. 及時向我反饋經過整理的信息和數據,甚至是結論,輔助決策

3. 主動關心同事,組織學習,幫助大家進步成長

 

團隊的人可能也有集中特徵:

1. 能力強,在某領域是專家

2. 能力一般,有潛力,但是非常有积極性

3. 能力一般,主動性一般

重要&緊急的事情只能交給能力強的人去做,意願上如果有問題也要說服對方去做,因人成事,可見能力強有多重要。

重要不緊急的事情就可以借事修人,如果做得好,這個人以後就有信心了,做的不好也有能力強的人給保底,不會造成業務問題。

技術想法也可以交給有积極性的人做,這必然會佔用一些時間,那麼這個人手頭上的無關痛癢的只好交給能力一般,主動性一般的人來做。

個人感悟:

不是每個人在工作中都是領導,但一定做過別的學長,師兄。在面對學弟學妹時是不是會覺得有些學弟辦事又快又好,而有些學弟什麼事情都要吩咐他才會去做,甚至告訴他方法也做不好。學長有時就是一個領導角色,學弟按要求將布置的任務完成,就覺得這個可以了,再有餘力可以主動承擔一些擅長的任務,就覺得用起來順手,下次有事找他,有好處也找他。我覺得最好的狀態是在工作之餘改善工作中一些複雜的操作繁瑣的步驟;給整個團隊帶來一些流程上的簡化,增加開發的效率;開發小工具能有效解決某些問題。工作之餘能夠在為團隊付出一些時間,領導應該能看的到。

 

 另外在本書中還看到了一些很優秀的PPT,不會做PPT的開發不是一個好銷售,當然這句話搞笑的很純粹,但是下面的這些PPT確實讓我覺得眼前一亮,顏色搭配,圖形搭配,樸素之中掩蓋不住的一種大氣之感。不尬吹了,直接上圖~

 

 

 

 

 

 

 

 

 

 

 

 

         

 

 

 

 

 

 

 

 

 

 

 

 

 

  

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

【其他文章推薦】

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

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

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

南投搬家前需注意的眉眉角角,別等搬了再說!

巴西東北岸海灘 再出現原油污染

摘錄自2019年12月31日中央社報導

巴西海軍今天(31日)表示,東北部塞阿拉州(Ceara)部分海灘發現原油油污,快兩個月前,這個地區也曾被另一波浮油侵襲。

那次的污染是原油大規模外洩的一部分,在9月到11月污染了巴西東北岸數百個海灘,威脅海洋生物、觀光業和漁業,源頭至今仍是個謎。

塞阿拉聯邦大學(Federal University of Ceara)海洋研究人員卡瓦坎特(Rivelino Cavalcante)告訴新聞網站G1,和這次污染相同,於今年稍早出現在海灘上的大量油污仍沈積在海床,因為洋流的關係才跑到岸邊。

巴西政府官員曾表示,檢測顯示外洩原油的源頭是委內瑞拉,但委國否認。

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

【其他文章推薦】

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

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

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

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

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

搶入特斯拉自駕電動車供應鏈 英特磊營收看漲

英特磊 8 日公布 6 月營收 7,693 萬元,月增 8.18% 而年增 15.2%,第 2 季營收 2.24 億元,季增 8.21% 年增 46.84%,月、季營收同步創高,公司並將在 9 月洽談車用防撞系統新單,可望打入 Tesla 發展自駕(ADAS)電動車需求,再創營運高峰。    據了解,英特磊收購 Soitec 後,取得全球最大車用防撞 IC 廠 UMS 供應認證,UMS 打入多數歐系高級車,包括 BMW、Audi、賓士等,同時間,UMS 也是與 Tesla 計畫合作自駕車系統 Mobileye 的主要客戶,在此緊密的車用供應鏈關係中,英特磊持續獲得熱賣車款點火。   英特磊看好第 3 季旺季需求,將獲得新布局的車用防撞雷達、Skyworks 物聯網帶動,因此公司先在 5 月進行歲修調整機台,將對全年營收衝刺動能有關鍵性助益。 ]

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

【其他文章推薦】

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

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

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

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

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