首页 > 其他分享 >异步转同步有什么意义

异步转同步有什么意义

时间:2024-01-31 15:22:05浏览次数:29  
标签:异步 同步 意义 线程 CompletableFuture 直接 方法

异步转同步有什么意义,直接使用同步方法不好吗?

一直有这个疑问,使用异步转同步就高端,直接使用同步方法一个一个直接就low,一直不理解,难道不是炫技的同时增加代码复杂度吗

后来gpt4给了我答案

使用 CompletableFuture.supplyAsync 提交异步任务然后通过 CompletableFuture.get() 阻塞等待结果,实质上是将一个异步过程转换为了同步操作。这种方式和直接使用同步方法确实在行为上相似,因为调用者都会等待结果完成。但是,它们之间还是有一些差异和潜在的意义:

线程利用:
异步转同步:在异步任务执行的同时,原始线程(通常是主线程或者处理用户请求的线程)可以继续执行其他任务,直到它需要结果并调用 .get() 方法阻塞等待。
直接同步:直接同步方法会阻塞原始线程,直到任务完成才能继续执行其他工作。

异常处理:
异步转同步:CompletableFuture 提供了更丰富的异常处理机制,可以在链式调用中处理异常。
直接同步:异常必须在方法内部或通过传统的 try-catch 块处理。

组合和链式调用:
异步转同步:CompletableFuture 允许你在未来某个时刻获取结果之前,对异步操作进行组合和链式调用,如 thenApply, thenCompose, thenCombine 等。
直接同步:同步方法无法进行类似的链式调用,通常需要在一个同步方法完成后再显式调用另一个方法。

可读性和维护性:
异步转同步:使用 CompletableFuture 可能会使代码结构更清晰,尤其是在处理多个依赖的异步操作时。
直接同步:代码可能更直观,因为它遵循传统的顺序执行模式。

资源管理:
异步转同步:即使是异步转同步,你依然可以控制异步任务的执行(如使用自定义的 Executor),这在直接同步方法中通常不可控。

超时控制:
异步转同步:CompletableFuture.get() 方法允许你设置超时,这样可以避免无限期地等待。
直接同步:实现超时可能需要额外的逻辑。

意义:
尽管异步转同步在行为上与直接同步类似,但它为未来的改进留下了空间。如果将来你决定让原始线程不阻塞,或者需要组合多个异步调用,使用 CompletableFuture 会更加灵活。
总的来说,即使在异步转同步的使用场景中,CompletableFuture 也提供了更多的控制、灵活性和可能的性能优势。然而,如果你不需要这些额外的特性,直接使用同步方法可能会更简单、更直接。

标签:异步,同步,意义,线程,CompletableFuture,直接,方法
From: https://www.cnblogs.com/PythonOrg/p/17999326

相关文章

  • 异步线程池
    @Configuration@EnableAsyncpublicclassAppConfigimplementsAsyncConfigurer{ @Bean("myAsyncThread”) publicExecutorgetAsyncExecutor(){ThreadPoolTaskExecutorexecutor=newThreadPoolTaskExecutor();executor.setCorePoolSize(10);executor......
  • 工作的意义是什么?
    员工就是个物品,什么经验、能力、学习,那不都是明码标价的吗?公司花钱去购买你的时间去创造价值,你没有价值就换呗,暂时离不开你那公司就再等一等。找到性价比更高的再把你替换掉,这就是事实。所以如果你是一个普通的打工人,对待工作要清醒点,不要玻璃心,更不要投入更多的感情,也不要去委......
  • kettle从入门到精通 第三十七课 kettle 全量同步(数据量小)
    1、下图是一些常见的数据同步业务场景:实时数据:对实时性要求很高,延迟在毫秒范围内。常见的有kafka/rabbitmq等消息中间件,mysqlbinlog日志,oracle归档日志等。离线数据:对实时性要求不高,可以分钟级、小时级、日级等。比如历史数据迁移或者T日处理T-1日数据等。全量同步:一般情况下......
  • 第十六天: 利用 sudo 实现授权、PAM、时间同步
    一、sudo组成sudo即superuserdo,允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录和管理时间,同样也提高了安全性sudo特性:sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用sudo,会提......
  • 不同服务器数据库,数据表数据同步方案
    代码片段:1usingDataSync.Core;2usingFurion.Logging.Extensions;3usingMicrosoft.Data.SqlClient;4usingMicrosoft.Extensions.Logging;5usingSystem.Data;6namespaceDataSync.Application.DataSync.Services7{8publicclassDataSyn......
  • 主从同步问题排查常用sql
    我们在配置mysql主从的时候经常会遇到一些问题,同步延迟、定位binlog错误、查看binlog等等问题,一般大家可能会用到其他方式或者命令,我一般都是采用纯sql的方式进行排查,这里把我常用的一些方法分享给大家:1.查询master和slave的状态showmasterstatus;showslavestatus;2.通过......
  • Qt 线程同步 QMutex、QReadWriteLock、QWaitCondition
    在Qt中,线程同步可以使用以下几种方式来实现:一、互斥锁(QMutex)互斥锁用于保护共享资源,确保在同一时间只有一个线程能够访问该资源。线程在访问共享资源之前需要获取互斥锁,使用完后再释放互斥锁,以确保同一时间只有一个线程在执行关键代码段。1.创建QMutex对象:在需要进行线程同步的......
  • [word] word 中如何使图示中的文本框和对应连接箭头同步移动?
    下图左侧图示中,文本框"其他垃圾"与"有害垃圾""厨余垃圾""可回收物"属于同一层级,我们想把"其他垃圾"文本框往右拖动至"可回收物"文本框正下方(效果参考下图右侧图示),使排版更加整齐。但是在拖动过程中,"其他垃圾"文本框对应的红色连接箭头仍保持原地不动,不能跟随文本框一起移动。下面......
  • celery实现异步任务、定时任务和延迟任务
    1.异步任务任务名.delay(传参数)2.延迟任务fromdatetimeimportdatetime,timedelta#atetime.utcnow()当前utc时间#当前时间+15秒eta=datetime.utcnow()+timedelta(seconds=15)#取消订单任务res=cancel_order.apply_async(args=['10001',],eta=eta)#15s......
  • 【Celery】异步任务框架入门使用
    背景.项目中需要用到后台数据爬取更新的功能,同步做起来web页面毫无用户体验可言。使用celery异步任务框架来解决这个问题简单、高效。用了一段时间比较稳定,现在有空梳理下文档。简介Celery是一个强大的分布式任务队列系统,它允许你将工作以异步的方式排队执行,这对于执行耗时......