iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Gauva使用ListenableFuture介绍说明
  • 713
分享到

Gauva使用ListenableFuture介绍说明

GauvaListenableFutureGauvaListenableFuture的使用 2023-01-09 18:01:57 713人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录一、ListenableFuture 介绍二、接口三、添加回调函数四、创建五、应用六、避免内嵌的Future一、ListenableFuture 介绍 并发是一个困难问题,但是通

一、ListenableFuture 介绍

并发是一个困难问题,但是通过强大和强大的抽象能够显著的简化工作。为了简化问题,Gauva使用ListenableFuture扩展了jdk的Future接口,

**我们强烈建议你在你所有的代码中使用ListenableFuture代替Future,**因为:

  • 大多数的Future方法需要它;
  • 这比以后更改为ListenableFuture更容易;
  • 实用方法的提供者不需要提供FutureListenableFuture方法的变体;

二、接口

传统的Future代表着异步计算的结果:一个计算可能也可能没有完成生成结果。Future可以是一个程序计算的句柄,一个来自服务的承诺提供给我们一个结果。

ListenableFuture允许你注册一个回调函数,一旦计算是完成或者计算是已经完成,回调函数会立马执行。这个简单的添加能有效的支持多种Future接口不支持的操作。

基础的操作被ListenableFuture添加是通过addListener(Runnable, Executor),它指定了当Future的计算完成之后,指定的Runnable将会在Executor中执行。

三、添加回调函数

大多数用户更喜欢使用Futures.addCallback(ListenableFuture, FutureCallback, Executor),一个FutueCallback有两个方法:

  • onSuccess(V) 如果future执行成功,基于结果进行执行。
  • onFailure(Throwable) 如果future执行失败,基于失败进行执行。

四、创建

相对于JDKExecutorService.submit(Callable) 方法初始化一个异步的计算。Guava提供了一个ListeningExecutorService 接口,它能在任何ExecutorService返回一个正常Future的地方,返回一个ListenableFuture。为了将ExecutorService转换成ListeningExecutorService ,仅需要使用MoreExecutors.listeningDecorator(executorService)

        ListeningExecutorService service =
                MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(
                  Runtime.getRuntime().availableProcessors()));
        ListenableFuture<String> listenableFuture = service.submit(() -> callDemo());
        Futures.addCallback(listenableFuture, new FutureCallback<String>() {
            @Override
            public void onSuccess(String result) {
                System.out.println("Run Ok : " + result);
//                service.shutdown();
            }
            @Override
            public void onFailure(Throwable t) {
                System.out.println("Run Fail: " + t);
            }
        }, service);

或者,如果你从一个基于FutureTaskapi进行转换,Guava提供了ListenableFutureTask.create(Callable)ListenableFutureTask.create(Runnable, V) 。并不像JDK,ListenableFutureTask并不意味着直接扩展。

如果您更喜欢设置未来值的抽象而不是实现计算值的方法,请考虑扩展 AbstractFuture<V> 或直接使用 SettableFuture

如果你必须将另一个API提供的Future转换成ListenableFuture,你没有选择除了使用重量级的JdkFutureAdapters.listenInPoolThread(Future) ,将Future转化成ListenableFuture。无论什么时候,只要有可能,都应该修改源代码去返回一个ListenableFuture

五、应用

使用ListenableFuture的重要原因是,它让异步的链操作成为可能。

很多有效的其它操作使用ListenableFuture是支持的,而单独使用Future是不支持的。不同的操作能够被不同的Executor执行,并且单个 ListenableFuture 可以有多个等待它的操作。

当多个操作应该在另一个操作开始时立即开始时——“扇出”——ListenableFuture 才起作用:它触发所有请求的回调。通过稍微多一点的工作,我们能“扇入”,或触发ListenableFuture进行计算只要若干个其它的Future执行完(看:Futures.allAsList)。

方法描述延伸
Futures.transfORMAsync(ListenableFuture, AsyncFunction, Executor)返回一个新的ListenableFuture,它的结果是应用AsyncFunction。AsyncFunction是对ListenableFuture结果的加工
Futures.transform(ListenableFuture, Function, Executor)返回一个新的ListenableFuture,它的结果是应用Function。Function是对ListenableFuture结果的加工
Futures.allAsList(Iterable<ListenableFuture<V>>)返回一个ListenableFuture,它的值是一个list包含了每一个输入输入future的值。如果任何的future失败或取消,这个future也失败或取消。
Futures.successfulAsList(Iterable<ListenableFuture>)返回一个ListenableFuture,它的值是一个list包含了每一个输入输入future的值。如果相对应的future失败或取消,将用null代替。

一个AsyncFunction 提供了一个方法ListenableFuture<B> apply(A a)。它用于异步传输一个值。

六、避免内嵌的Future

ListenableFuture<ListenableFuture<String>> nestedFuture =
                executorService.submit(() -> otherExecutorService.submit(() -> callDemo())); 

上面的代码是不正确的, 因为如果外部Future的取消与外部Future的完成竞争,则该取消不会传播到内部Future。 使用 get() 或侦 听器检查其他Future的失败也是一个常见错误,但除非特别注意,否则从 otherCallable 抛出的异常将被抑制。

为了避免这种情况,Guava 的所有Future处理方法(以及一些来自 JDK)都有 *Async 版本,可以安全地解开这个嵌套:

  • Futures.transformAsync(ListenableFuture, AsyncFunction, Executor)
  • ExecutorService.submit(Callable)
  • Futures.submitAsync(AsyncCallable, Executor)

到此这篇关于Gauva使用ListenableFuture介绍说明的文章就介绍到这了,更多相关Gauva ListenableFuture内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Gauva使用ListenableFuture介绍说明

本文链接: https://www.lsjlt.com/news/177223.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Gauva使用ListenableFuture介绍说明
    目录一、ListenableFuture 介绍二、接口三、添加回调函数四、创建五、应用六、避免内嵌的Future一、ListenableFuture 介绍 并发是一个困难问题,但是通...
    99+
    2023-01-09
    Gauva ListenableFuture Gauva ListenableFuture的使用
  • css样式说明介绍
    为了让网页元素的样式更加丰富,也为了让网页的内容和样式能拆分开,CSS由此思想而诞生,CSS是 Cascading Style Sheets 的首字母缩写,意思是层叠样式表。有了CSS,html中大部分表现样式的标签就废弃不用了,html只...
    99+
    2023-06-03
  • Python中变量的说明介绍
    本篇内容介绍了“Python中变量的说明介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python变量中所有的类成员都是公共的 ,所有的...
    99+
    2023-06-17
  • 关于reduce的介绍及用法说明
    目录参数介绍举例说明1.把数组合并为一个对象2.去重3.求和4.求最大值和最小值5.扁平数组6.求字符串中各个字符出现的次数 reduce总的来说用的不多,但最近看一些文章...
    99+
    2024-04-02
  • Python线程实体的说明介绍
    本篇内容主要讲解“Python线程实体的说明介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python线程实体的说明介绍”吧!我们在做软件开发的时候很多要用到多线程技术。例如如果做一个下载软...
    99+
    2023-06-17
  • 关于"引用"的几点说明介绍
    一、引用的基本知识 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名; 说明: (1)&在此...
    99+
    2022-11-15
    引用
  • 怎样进行Visual Studio数据介绍说明
    怎样进行Visual Studio数据介绍说明,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。因此,我们需要添加一个Visual Studio数据来比较我们的期望值和返回值。...
    99+
    2023-06-17
  • Class.forName()用法简介说明
    Class.forName()是Java反射机制中的一个方法,它的作用是根据类的全限定名(包括包名和类名)动态加载类,返回对应的Cl...
    99+
    2023-09-09
    用法
  • 基于redis.properties文件的配置及说明介绍
    在使用到redis连接池时,需要进行一些redis相关配置,redis.properties文件是由编程者自己在项目classpath路径(如eclipse的src)下建立的,并非从redis安装包中获取的...
    99+
    2024-04-02
  • z3py使用说明
    http://z3prover.github.io/api/html/z3.html http://www.cs.tau.ac.il/~msagiv/courses/asv/z3py/guide-examples.htm 学习...
    99+
    2023-01-31
    使用说明 z3py
  • window.dialogArguments 使用说明
    f1.php页面JS代码,第二个传的参数必须是self不能是别的 复制代码 代码如下: <script type="text/javascript"> function ...
    99+
    2022-11-21
    dialogArguments
  • express项目文件目录的说明与功能介绍
    这篇文章主要介绍“express项目文件目录的说明与功能介绍”,在日常操作中,相信很多人在express项目文件目录的说明与功能介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”express项目文件目录的说...
    99+
    2023-06-14
  • springboot maven 打包插件介绍及注意事项说明
    目录springboot maven 打包插件介绍及注意事项1. springboot项目默认生成的可执行jar,为什么不能作为依赖导入其他项目?2. 有木有办法可以一次性获得可执行...
    99+
    2024-04-02
  • C语言简明介绍指针的使用
    目录1. 指针类型2. 野指针3. 指针的运算3.1 指针+-整数3.2指针-指针3.3 指针的关系运算4. 指针数组1. 指针类型 指针以字节为单位; 指针类型决定了解引用时能访问...
    99+
    2024-04-02
  • RCMD的使用说明
    这篇文章主要介绍“RCMD的使用说明”,在日常操作中,相信很多人在RCMD的使用说明问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”RCMD的使用说明”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!*****...
    99+
    2023-06-08
  • 【pytorch】torch.cdist使用说明
    使用说明 torch.cdist的使用介绍如官网所示, 它是批量计算两个向量集合的距离。 其中, x1和x2是输入的两个向量集合。 p 默认为2,为欧几里德距离。 它的功能上等同于 scipy.sp...
    99+
    2023-09-02
    pytorch 深度学习 python
  • Xilinx URAM使用说明
    Xilinx URAM(Ultra RAM)是一种高性能、低延迟的存储器资源,用于在Xilinx FPGA器件中实现大容量的存储和高...
    99+
    2023-09-23
    Xilinx
  • 对command对象属性及其方法进行介绍说明
    在Java中,Command对象是一个表示命令的抽象类,它用于封装一个操作的信息,包括命令的名称、参数等。Command对象可以用于...
    99+
    2023-09-22
    command
  • Python sys 使用说明
    获取linux下python的路径,以及执行python时使用的参数。 代码如下:   #!/usr/bin/python # -*- encoding:utf-8 -*- # time:2012-07-06 import sys;   p...
    99+
    2023-01-31
    使用说明 Python sys
  • mysql8.0JSON_CONTAINS的使用说明
    目录JSON_CONTAINS的使用语法案例JSON_CONTAINS函数问题结构如下JSON_CONTAINS的使用 语法 JSON_CONTAINS(json_doc, val[...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作