并发编程工具集——CompletionService(三十五)

利用 CompletionService 实现 Dubbo 中的 Forking Cluster

  1. Dubbo 中有一种叫做 Forking 的集群模式,这种集群模式下,支持并行地调用多个查询服务,只要有一个成功返回结果,整个服务就可以返回了。
  2. 例如你需要提供一个地址转坐标的服务,为了保证该服务的高可用和性能,你可以并行地调用 3 个地图服务商的 API,然后只要有 1 个正确返回了结果 r,那么地址转坐标这个服务就可以直接返回 r 了。这种集群模式可以容忍 2 个地图服务商服务异常,但缺点是消耗的资源偏多。(原本只需调用一个,现在并行调用三个,并发一下就翻成了三倍)
  3. 利用 CompletionService 可以快速实现 Forking 这种集群模式

    1. 首先我们创建了一个线程池 executor 、一个 CompletionService 对象 cs 和一个Future<Integer>类型的列表 futures,

    2. 每次通过调用 CompletionService 的 submit() 方法提交一个异步任务,会返回一个 Future 对象,我们把这些 Future 对象保存在列表 futures 中。
    3. 通过调用 cs.take().get(),我们能够拿到最快返回的任务执行结果,只要我们拿到一个正确返回的结果,就可以取消所有任务并且返回最终结果了。

 

CompletionService的实现原理和构造函数

  1. 由 Java SDK 并发包提供
  2. 实现原理:内部维护了一个阻塞队列,当任务执行结束就把任务的执行结果加入到阻塞队列中,CompletionService 会把任务执行结果的 Future 对象加入到阻塞队列中;上面的实例代码是把任务最终的执行结果放入阻塞队列中
  3. 如何创建:CompletionService 接口的实现类是 ExecutorCompletionService,共有两个构造方法
    • ExecutorCompletionService(Executor executor);
    • ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue);
    • 这两个构造方法都需要传入一个线程池,如果不指定 completionQueue,那么默认会使用无界的 LinkedBlockingQueue。任务执行结果的 Future 对象就是加入到 completionQueue 中。

 

CompletionService 接口的五个方法

  1. CompletionService 接口提供的方法有 5 个
  2. 其中,submit() 相关的方法有两个。一个方法参数是Callable<V> task,前面利用 CompletionService 实现询价系统的示例代码中,我们提交任务就是用的它。
  3. 另外一个方法有两个参数,分别是Runnable task和V result,这个方法类似于 ThreadPoolExecutor 的 <T> Future<T> submit(Runnable task, T result)
  4. 其余的 3 个方法,都是和阻塞队列相关的
    • take()、poll() 都是从阻塞队列中获取并移除一个元素;
    • 它们的区别在于如果阻塞队列是空的,那么调用 take() 方法的线程会被阻塞,而 poll() 方法会返回 null 值。
  5. poll(long timeout, TimeUnit unit) 方法支持以超时的方式获取并移除阻塞队列头部的一个元素,如果等待了 timeout unit 时间,阻塞队列还是空的,那么该方法会返回 null 值。

 总结

  1. 当需要批量提交异步任务的时候建议你使用 CompletionServiceCompletionService 将线程池 Executor 和阻塞队列 BlockingQueue 的功能融合在了一起,能够让批量异步任务的管理更简单。
  2. 除此之外,CompletionService 能够让异步任务的执行结果有序化,先执行完的先进入阻塞队列,利用这个特性,你可以轻松实现后续处理的有序性,避免无谓的等待,同时还可以快速实现诸如 Forking Cluster 这样的需求。
  3. CompletionService 的实现类 ExecutorCompletionService,需要你自己创建线程池,虽看上去有些啰嗦,但好处是你可以让多个 ExecutorCompletionService 的线程池隔离,这种隔离性能避免几个特别耗时的任务拖垮整个应用的风险

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544099.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

sentinel基于Nacos数据持久化

sentinel基于Nacos数据持久化 1.引入依赖 <!-- 持久化用到 --> <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId> </dependency>2.yml配置 server:port: 8091tomcat:max-thre…

【深度学习】03-神经网络01-4 神经网络的pytorch搭建和参数计算

# 计算模型参数,查看模型结构,我们要查看有多少参数&#xff0c;需要先安装包 pip install torchsummary import torch import torch.nn as nn from torchsummary import summary # 导入 summary 函数&#xff0c;用于计算模型参数和查看模型结构# 创建神经网络模型类 class Mo…

一体化运维监控管理平台的全面监控能力

在当今高度信息化的时代&#xff0c;运维监控管理平台的重要性日益凸显。一个优秀的监控平台不仅要能够全面覆盖各类IT和智能设备&#xff0c;还需具备灵活性和可扩展性&#xff0c;以适应不断变化的监控需求。本文旨在深入探讨一体化运维监控管理平台的全面监控能力&#xff0…

MySQL record 08 part

数据库连接池&#xff1a; Java DataBase Connectivity&#xff08;Java语言连接数据库&#xff09; 答&#xff1a; 使用连接池能解决此问题&#xff0c; 连接池&#xff0c;自动分配连接对象&#xff0c;并对闲置的连接进行回收。 常用的数据库连接池&#xff1a; 建立数…

ChatGLM-6B 部署与使用——打造你的专属GLM

ChatGLM-6B 部署与使用指南 ChatGLM-6B 是清华大学与智谱 AI 开源的一款对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;参数达到 62 亿&#xff0c;因其卓越的语言理解与生成能力&#xff0c;受到广泛关注。 一、在 DAMODEL 上部署 ChatGLM-6B…

基于单片机巡迹避障智能小车系统

文章目录 前言资料获取设计介绍设计程序具体实现截图设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们…

RPA + 计算机视觉

随着超自动化成为顶级企业技术趋势之一&#xff0c;领先的机器人流程自动化 (RPA) 公司开始将人工智能功能集成到其自动化工具中&#xff0c;以创建能够自动化端到端流程并做出决策的智能机器人。计算机视觉是新一代 RPA 工具的关键 AI 功能之一。 在本文中&#xff0c;我们将…

2024年CSP-J认证 CCF信息学奥赛C++ 中小学初级组 第一轮真题-选择题解析

2024年 中小学信息学奥赛CSP-J真题解析 1、32 位 int 类型的存储范围是 A、 -2147483647 ~ 2147483647 B、 -2147483647 ~ 2147483648 C、 -2147483648 ~ 2147483647 D、 -2147483648 ~ 2147483648 答案&#xff1a;C 考点分析&#xff1a;主要考查小朋友们数据类型的存储…

Centos/fedora/openEuler 终端中文显示配置

注意&#xff1a;这里主要解决的是图形界面、远程登录界面的中文乱码问题 系统原生的终端&#xff08;如虚拟机系统显示的终端&#xff09;&#xff0c;由于使用的是十分原始的 TTY 终端&#xff0c;使用点阵字体进行显示&#xff0c;点阵字体不支持中文&#xff0c;因此无法显…

前端——表单标签样式

1. form表单标签 块级元素 action: 表单提交地址 method: 表单提交格式 https网络协议请求格式: post/get等 通常: post方式是发送数据 而get是拿取数据 name: 表单的名称 target: 提交完表单之后 你的新页面在哪里打开 2. input输入控件 可以通过type属性 …

7,STM32CubeMX配置IIC工程(OLED显示)

1&#xff0c;前言 单片机型号&#xff1a;STM32F407 编程环境 &#xff1a;STM32CubeMX Keil v5 硬件连接 &#xff1a;串口1&#xff0c;ADC1CH5--->PA5 注&#xff1a;本工程在1&#xff0c;STM32CubeMX工程基础&#xff08;配置Debug、时钟树&#xff09;基础上…

【Unity保龄球项目】的实现逻辑以及代码解释

1.BaoLQManager.cs 这个脚本实现了基本的保龄球游戏逻辑&#xff0c;包括扔球功能。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class BaoLQManager : MonoBehaviour {// 业务逻辑1&#xff1a;把保龄球扔出去// 业务逻辑2&am…

祝桥镇星光村火情闪电救援:速控之下,安全警钟长鸣

安科瑞武陈燕 在秋日的午后&#xff0c;阳光本应温柔地洒在浦东新区祝桥镇星光村的每一个角落&#xff0c;然而&#xff0c;一场突如其来的火灾打破了这份宁静。 9月2日中午12时许&#xff0c;该村1队的一户居民家中突然燃起熊熊大火&#xff0c;浓烟滚滚自二楼窗口腾空而起&…

gdb调试和makefile管理

一.gdb调试工具 命令 简写 作用 help h 按模块列出命令类 help class 查看某一类型的具体命令 lsit l 查看代码&#xff0c;可跟行号和函数名 quit q 退出gdb run r 全速运行程序 start 单步执行&#xff0c;运行程序&#xff0c;停在第一行执行语句 next …

Qt 窗口类的继承关系和作用

核心基类 [1] QObject&#xff1a;Qt中许多类的基类&#xff0c;支持Qt对象模型&#xff0c;包括信号和槽机制、对象树和事件系统等。虽然它本身不是直接用于创建窗口的&#xff0c;但它是许多窗口和控件类继承链中的重要一环。 注&#xff1a;如果你创建了一个自定义类&…

杰发科技——Eclipse环境安装

文件已传到网盘&#xff1a; 1. 安装文件准备 2. 安装Make 默认路径&#xff1a;C:\Program Files (x86)\GnuWin32\bin\ 不复制的话会报错 Error: Program "make" not found in PATH 3. 安装工具链 默认路径&#xff1a;C:\Program Files (x86)\Arm GNU Toolchain…

OpenAI converting API code from GPT-3 to chatGPT-3.5

题意&#xff1a;将OpenAI API代码从GPT-3转换为ChatGPT-3.5 问题背景&#xff1a; Below is my working code for the GPT-3 API. I am having trouble converting it to work with chatGPT-3.5. 以下是我用于GPT-3 API的工作代码。我在将其转换为适用于ChatGPT-3.5时遇到了…

Android Studio 真机USB调试运行频繁掉线问题

一、遇到问题 Android Studio使用手机运行项目时&#xff0c;总是频繁掉线&#xff0c;连接很不稳定&#xff0c;动不动就消失&#xff0c;基本上无法使用 二、问题出现原因 1、硬件问题&#xff1a;数据线 换条数据线试试&#xff0c;如果可以&#xff0c;那就是数据线的…

15年408-数据结构

第一题 解析&#xff1a; 栈第一次应该存main的信息。 然后进入到main里面&#xff0c;要输出S(1)&#xff0c;将S(1)存入栈内&#xff0c; 进入到S(1)中&#xff0c;1>0,所以还要调用S(0) S(0)进入栈中&#xff0c;此时栈内从下至上依次是main(),S(1),S(0) 答案选A 第二题&…

昇腾AI异构计算架构CANN——高效使能AI原生创新

异构计算与人工智能的关系是什么&#xff1f;昇腾AI异构计算架构CANN是什么&#xff1f;有哪些主要特点&#xff1f;开发者如何利用CANN的原生能力进行大模型创新&#xff0c;构筑差异化竞争力&#xff1f;带着这些问题&#xff0c;我们来认识昇腾AI异构计算架构——CANN。 1 …