国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

netty 耗時任務如何處理

Travis / 2712人閱讀

摘要:如果有處理耗時任務的應該怎么辦可以專門開一個線程池,來專門處理耗時業務。如果是在線程,如果想處理耗時任務邏輯,那么就需要新建一個并調用他的相關方法其本質是一個用來處理事件的線程,其本質是一個線程池。

netty 處理耗時的任務邏輯,是不能在IO線程處理,因為這會造成堵塞,將會嚴重影響性能。那怎么區分IO線程呢?
答案就是EventLoop,EventLoop用來處理IO線程,因此耗時任務的handler不要在EventLoop里面處理。
以下面代碼為例:

 bossGroup = new NioEventLoopGroup();
 workerGroup = new NioEventLoopGroup();

 try {
    ServerBootstrap bootstrap = new ServerBootstrap();
    bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
 ....

其中workerGroup就是專門用來處理IO線程業務邏輯的,例如執行一些 編碼、解碼 等不耗時的業務處理。

如果有處理耗時任務的handler應該怎么辦?
可以專門開一個線程池,來專門處理耗時業務。Netty Api 已經提供了一些說明,http://netty.io/4.1/api/index...,ChannelPipeline中 可以找到如下描述:

A user is supposed to have one or more ChannelHandlers in a pipeline to receive I/O events (e.g. read) and to request I/O operations (e.g. write and close). For example, a typical server will have the following handlers in each channel"s pipeline, but your mileage may vary depending on the complexity and characteristics of the protocol and business logic:

Protocol Decoder - translates binary data (e.g. ByteBuf) into a Java object.
Protocol Encoder - translates a Java object into binary data.
Business Logic Handler - performs the actual business logic (e.g. database access).
and it could be represented as shown in the following example:
static final EventExecutorGroup group = new DefaultEventExecutorGroup(16);
...

ChannelPipeline pipeline = ch.pipeline();

 pipeline.addLast("decoder", new MyProtocolDecoder());

 pipeline.addLast("encoder", new MyProtocolEncoder());

 // Tell the pipeline to run MyBusinessLogicHandler"s event handler methods
 // in a different thread than an I/O thread so that the I/O thread is not blocked by
 // a time-consuming task.
 // If your business logic is fully asynchronous or finished very quickly, you don"t
 // need to specify a group.
 pipeline.addLast(group, "handler", new MyBusinessLogicHandler());

其中EventExecutorGroup 就是專門來處理耗時業務的線程池。

在實際生產環境中,我們可能會碰到 需要臨時執行也行計劃任務,,這些任務如果不耗時,我們可以通過channel提供的計劃任務方法處理:

future =  channel.eventLoop.scheduleAtFixedRate(new Runnable() {

            @Override
            public void run() {
                            //邏輯代碼,非耗時任務
               }
        }, 6, 6, TimeUnit.HOURS);
       ....

如果計劃任務里面的邏輯比較耗時,那么就不能再用eventLoop,因為這會阻塞IO線程。如果是通過pipeline.addLast(group, "handler", new MyBusinessLogicHandler()); 這種方式添加的業務線程我們可以使用下面的方式添加計劃任務方法實現:

***future = ctx.executor().scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
            }
        }, 6, 6, TimeUnit.HOURS);***

...

netty 源碼

public EventExecutor executor() {
        return (EventExecutor)(this.executor == null?this.channel().eventLoop():this.executor);
    }

如果this.executor為null,就返回channel().eventLoop(),這個是io讀寫線程,肯定是不能執行耗時任務的。
如果不為空,那么是怎么傳進來的呢?

DefaultChannelPipeline

public final ChannelPipeline addLast(EventExecutorGroup group, String name, ChannelHandler handler) {
        final AbstractChannelHandlerContext newCtx;
        synchronized(this) {
            checkMultiplicity(handler);
            newCtx = this.newContext(group, this.filterName(name, handler), handler);

DefaultChannelPipeline 的addLast(EventExecutorGroup group, String name, ChannelHandler handler)為例,該方法部分源碼如下

    @Override
    public final ChannelPipeline addLast(EventExecutorGroup group, String name, ChannelHandler handler) {
        final AbstractChannelHandlerContext newCtx;
        synchronized (this) {
            checkMultiplicity(handler);

            newCtx = newContext(group, filterName(name, handler), handler);

            addLast0(newCtx);
   ...代碼略去...
private AbstractChannelHandlerContext newContext(EventExecutorGroup group, String name, ChannelHandler handler) {
        return new DefaultChannelHandlerContext(this, this.childExecutor(group), name, handler);
    }

通過源碼發現:其實就是我們在添加handler時指定的DefaultEventExecutorGroup。
所以結論是:如果在處理耗時任務的Handler添加時用到了DefaultEventExecutorGroup是可以 ctx.executor().scheduleAtFixedRate這么用的,但是如果你再添加handler時沒有沒有指定特殊的EventExecutorGroup,是不能執行耗時任務的。

如果是在IO線程,如果想處理耗時任務邏輯,那么就需要新建一個EventExecutorGroup,并調用他的相關方法

EventLoop:其本質是一個用來處理IO事件的線程,EventLoopGroup 其本質是一個線程池。一個EventLoop可以和多個Channel綁定,處理多個Channel的IO事件;但是一個Channel在整個生命周期內只會被一個EventLoop處理,這就也就保證了線程安全。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/66451.html

相關文章

  • Netty AUTO_READ讀數據流程分析

    摘要:用這種方式很好的規避了多線程所帶來的問題,很值得我們借鑒那么這個怎么來的呢看一下的方法如果為,就返回。 Netty channelRegisteredChannelActive---源碼分析經過下面的分析我們可以了解netty讀數據的一個過程,以及為什么channelActive方法、channelReadComplete方法會回調ChannelOutboundHandler的read...

    fevin 評論0 收藏0
  • 為Java程序員金三銀四精心挑選的300余道Java面試題與答案

    摘要:為程序員金三銀四精心挑選的余道面試題與答案,歡迎大家向我推薦你在面試過程中遇到的問題我會把大家推薦的問題添加到下面的常用面試題清單中供大家參考。 為Java程序員金三銀四精心挑選的300余道Java面試題與答案,歡迎大家向我推薦你在面試過程中遇到的問題,我會把大家推薦的問題添加到下面的常用面試題清單中供大家參考。 前兩天寫的以下博客,大家比較認可,熱度不錯,希望可以幫到準備或者正在參加...

    tomorrowwu 評論0 收藏0
  • Netty 源碼分析之 三 我就是大名鼎鼎的 EventLoop(二)

    摘要:接上篇源碼分析之三我就是大名鼎鼎的一的處理循環在中一個需要負責兩個工作第一個是作為線程負責相應的操作第二個是作為任務線程執行中的任務接下來我們先從操縱方面入手看一下數據是如何從傳遞到我們的中的是模型的一個實現并且是基于的那么從的前生今世之四 接上篇Netty 源碼分析之 三 我就是大名鼎鼎的 EventLoop(一) Netty 的 IO 處理循環 在 Netty 中, 一個 Even...

    whidy 評論0 收藏0
  • 高級架構師實戰:何用最小的代價完成爬蟲需求

    摘要:在系統正常運行時,可以變更爬蟲的配置,一旦實時監控爬蟲出現異常,可實時修正配置進行干預。從數據庫中實時讀取配置信息,響應業務層的配置請求。處理系統通過服務層,每次去取配置信息可能維護人員在實時修正及待抓取的列表進行處理。 showImg(https://segmentfault.com/img/bVLa4V?w=960&h=540); 一 ?緣起 在我工作的多家公司,有眾多的領域,如房...

    light 評論0 收藏0

發表評論

0條評論

Travis

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<