-
2016-12-16 10:03:50昨天面试的时候看到的一个题
1.有三个ajax请求,如何让这三个ajax请求串行执行,即第一个执行完成后在执行另一个?
我回答的是判断上一个请求返回结果,执行完成之后在执行下一个,对吗?
2.如何让他们并行执行,然后三个请求都执行完成后,再执行某个操作?
我觉得写三个$.ajax不就是并发执行了吗,然后遍历看是否都返回结果了,如果都返回结果了,再进行继续的操作,这么想对吗?
意义是什么呢?
经过csdn的大神的解答明白了,其实考察的就是同步和异步。
//串行执行分两种。 //一是用同步模式async: false,三个ajax请求连着写就可以了。 $.ajax({ url: "ajax请求1", async: false, success: function (data) { console.log("ajax请求1 完成"); } }); $.ajax({ url: "ajax请求2", async: false, success: function (data) { console.log("ajax请求2 完成"); } }); $.ajax({ url: "ajax请求3", async: false, success: function (data) { console.log("ajax请求2 完成"); } }); //二是用异步模式async: true,三个ajax请求嵌套写。 $.ajax({ url: "ajax请求1", async: true, success: function (data) { console.log("ajax请求1 完成"); $.ajax({ url: "ajax请求2", async: true, success: function (data) { console.log("ajax请求2 完成"); $.ajax({ url: "ajax请求3", async: true, success: function (data) { console.log("ajax请求3 完成"); } }); } }); } }); //并行执行就只能用异步模式。并设置变量进行计数 var num = 0; function isAllSuccess() { num++; if (num>=3) console.log("三个ajax请求全部完成"); } $.ajax({ url: "ajax请求1", async: true, success: function (data) { console.log("ajax请求1 完成"); isAllSuccess(); } }); $.ajax({ url: "ajax请求2", async: true, success: function (data) { console.log("ajax请求3 完成"); isAllSuccess(); } }); $.ajax({ url: "ajax请求3", async: true, success: function (data) { console.log("ajax请求3 完成"); isAllSuccess(); } });
更多相关内容 -
python 串行执行和并行执行实例
2020-09-16 22:47:16主要介绍了python 串行执行和并行执行实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
并发请求,串行执行
2020-06-20 23:44:40站点收到并发请求需要串行处理,或者并行执行的业务某个环节需要串行处理。 二、分析 1,只能针对操作同一条数据的业务处理串行处理,整体必须并行处理。 2,因为执行速度很快,发生并发时,最好每一条都被执行,...一、问题
站点收到并发请求需要串行处理,或者并行执行的业务某个环节需要串行处理。
二、分析
1,只能针对操作同一条数据的业务处理串行处理,整体必须并行处理。
2,因为执行速度很快,发生并发时,最好每一条都被执行,而不是返回“请稍后重试”,需要等待和重试。
3,支持分布式部署,同时有多个节点。
4,如果整体请求量特别大且处理需要时间,那么理应采用异步和队列。用队列消费的时候,应该也只是调取业务方法,队列本身不应该关心业务上面的事情。且队列消费应该也是并发的。
三、解决方案
方案一:数据库多版本并发控制(mvcc)
本质是利用数据库update串行执行机制。数据行加版本,假如有A、B两个事务针对同一条数据处理。
事务B修改版本为1的数据,发现修改了0行,知道同时有别人修改过数据,回滚。有的数据库有隐藏字段用于mvcc,不用自己维护一个版本字段。
缺点:
1,要求业务处理对数据有修改,否则如果业务处理只查询不需要修改数据就没法用了,不能为了修改而增加修改逻辑。不过如果只是查询而没有数据变更,一般也不需要串行执行。
2,这种方式依赖于事务,如果程序执行过程没有事务,最后一步发现版本变更了,,前面执行的逻辑无法回滚。
不推荐
方案二:依赖数据库锁(悲观锁)
当一个事务开始执行,读取数据的时候就加锁,让其他操作等待,实现整体业务操作是串行化的,一个业务操作开始~结束,另一个业务操作才开始。
通过锁解决方案一中要求业务处理支持事务的问题。锁需要设置超时时间,防止死锁
缺点:需要为行数据进行锁定。频繁的加锁、解锁,影响效率。
不推荐。
方案三:分布式锁
最好不在数据库上操作实现串行化,增大数据库压力,在程序执行过程中实现串行。比如可以通过redis分布式锁实现,具体请自行搜索,哈哈。不一定要用redis,任何方式实现了分布式锁都可以,哪怕自己弄个数据库来实现都行(redis也是数据库的一种)。
当然如果你是单机的,可以在程序中加线程锁控制,每种语言都有。但是不推荐,如果以后升级集群部署了,估计会忘记改。
-
并行传输和串行传输的区别是什么
2021-06-27 10:23:17串行传输的速度比并行传输的速度要慢得多,但费用低。并行传输适用距离短,而串行传输适用远距离传输。本教程操作环境:windows10系统、Dell G3电脑。什么是串行通信串行通信是指使用一条数据线,将数据一位一位地...区别:并行通信端口是LPT1;而串行通信端口是COM1、COM2。串行传输的速度比并行传输的速度要慢得多,但费用低。并行传输适用距离短,而串行传输适用远距离传输。
本教程操作环境:windows10系统、Dell G3电脑。
什么是串行通信
串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。
什么是并行通信
在计算机和终端之间的数据传输通常是靠电缆或信道上的电流或电压变化实现的。如果一组数据的各数据位在多条线上同时被传输,这种传输方式称为并行通信。
串行通信和并行通信的区别分析
并行通信端口,即LPT1,俗称打印口,因为它常接打印机,它是同时传送八路信号,一次并行传送完整的一个字节信息。
串行通信端口,即COM1、COM2,一般接鼠标,外置Modem或其他串口设备。它在一个方向上只能传送一路信号,一次只能传送一个二进制位,传送一个字节信息时,只能一位一位地依次传送。
串行传输的速度比并行传输的速度要慢得多,但费用低。并行传输适用距离短,而串行传输适用远距离传输。
-
RxHttp 一条链发送请求之多请求串行与并行 (五)
2019-01-25 22:07:13HttpSender 开篇之功能使用篇,超好用、功能超级强大的Http请求框架 HttpSender 介绍篇之生命周期、公共参数相关配置 HttpSender 介绍篇之Parser介绍 HttpSender 介绍篇之Param介绍 HttpSender 扩展篇之Parser扩展 ...前言
现实开发中,一个页面很少只有一个请求的,一般都有多个请求,有的需要串行,有的需要并行,使用传统的方法,如果有n个接口,我们就要设置n个接口回调,如果是串行的话,还需要在当前接口成功或失败的地方,调用下个一个请求,一个接着一个,真的是要逼死强迫症患者,而且代码可读性非常的差,新人来了往往要看上半天,不好维护且容易出错。
本文使用RxHttp请求框架作为案例演示,如果你不了解RxHttp,请查看30秒上手新一代Http请求神器RxHttp
请容许我再唠两句:RxHttp从4月中旬开始推广,在大家都对新的Http请求框架学不动或者懒得学的情况下,RxHttp依然收获了一大波粉丝,目前在Github上一经有415颗星,其中
这两篇文章更是得到了得到「玉刚说」及「刘望舒」微信公众号独家原创发布,我想,这也是对RxHttp的一种肯定,欢迎大家体验RxHttp,它优雅的写法及强大的功能,相信你一定会爱上它。
gradle依赖
implementation 'com.rxjava.rxhttp:rxhttp:1.0.9' annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:1.0.9' //注解处理器,生成RxHttp类 implementation 'com.rxjava.rxlife:rxlife:1.0.7' //页面销毁,关闭请求,非必须 // if you use kotlin kapt 'com.rxjava.rxhttp:rxhttp-compiler:1.0.9'
接下来,我们正是开始。
并行
现在很多页面是这样的,上面是Banner条,Banner条下面是数据列表(假设是学生列表),这样就涉及到两个接口,一个是获取Banner条数据,另一是获取学生列表数据,这两个接口没有任何关系,所以我们可以并行去实现
//Banner 的Observable对象 Observable<Banner> bannerObservable = RxHttp.get("http://...") .asObject(Banner.class); //学生的Observable对象 Observable<List<Student>> studentObservable = RxHttp.get("http://...") .asList(Student.class); //这里使用RxJava组合符中的merge操作符,将两个被观察者合并为一个 Observable.merge(bannerObservable, studentObservable) .as(RxLife.asOnMain(this)) //感知生命周期,自动关闭请求 .subscribe(o -> { //请求成功,回调2次,一次是Banner数据,一次Student列表 if (o instanceof Banner) { //获取到banner数据 } else if (o instanceof List) { //获取到学生列表数据 } }, throwable -> { //出现异常 }, () -> { //2个请求执行完毕,开始更新UI });
可以看到,我们首先通过RxHttp类拿到Banner和Student的两个Observable对象,然后通过merge操作符,将两个Observable对象合并为一个,并订阅观察者,这样就能在onNext回调中拿到Banner和Student数据,并在onComplete回调中更新UI。
可是,这样就完了吗?熟悉RxJava的同学应该知道,RxJava在出现异常后并且回调到onError接口时,就会停止工作,那么如果Banner接口先出现异常,岂不是收不到Student信息了?是的,那么,我们应该如何去处理呢,其实很简单,RxJava为我们提供了异常捕获操作符,如:
onErrorResumeNext
和onErrorReturn
,作用就是出现异常了,我们如何去补救它。在这,我们使用onErrorResumeNext操作符,代码如下//Banner 的Observable对象 Observable<Banner> bannerObservable = RxHttp.get("http://...") .asObject(Banner.class) .onErrorResumeNext(Observable.empty()); //出现异常,发送一个空的Observable对象 //学生的Observable对象 Observable<List<Student>> studentObservable = RxHttp.get("http://...") .asList(Student.class); //这里使用RxJava组合符中的merge操作符,将两个被观察者合并为一个 Observable.merge(bannerObservable, studentObservable) .as(RxLife.asOnMain(this)) //感知生命周期,自动关闭请求 .subscribe(o -> { //请求成功,回调2次,一次是Banner数据,一次Student列表 if (o instanceof Banner) { //获取到banner数据 } else if (o instanceof List) { //获取到学生列表数据 } }, throwable -> { //出现异常 }, () -> { //2个请求执行完毕,开始更新UI });
上面我们只加了
onErrorResumeNext(Observable.empty())
这一行代码,Observable.empty()是一个不会发射任何事件的Observable对象。所以,这个时候如果Banner的Observable出现异常,就不会发射任何事件,Student 的Observable对象便可继续执行,只是在onNext回调中,就只能收到一次Student的回调(请求成功的话),并且随后执行onComplete回调更新UI,这样就能保证即使Banner接口出错了,我们依然可以正常现实学生列表数据。说的抽象一点就是保证A接口不影响B接口,但是B可以影响A接口,如果要保证A、B两个接口互不影响,分别对A、B接口处理异常即可,如果有3个、4个甚至更多的请求,可以使用Observable.mergeArray
操作符。串行
接下来,看看我们串行,假设我们有这样一个需求,需要在注册完成后立即去登录,这种情况下,就只能串行去实现,在这,我们使用RxJava的
flatMap
这个操作符去实现flatMap
RxHttp.postForm("http://...") //发送注册请求 .add("userName", "zhangsan") .add("password", "123456") .asObject(Register.class) .flatMap((io.reactivex.functions.Function<Register, ObservableSource<User>>) register -> { //注册成功,拿到注册信息去登录,并返回User对象 return RxHttp.get("http://...") //发送登录请求 .add("userId", register.getUserId()) .add("password", register.getPassword()) .subscribeOnCurrent() //当前线程发送登录请求 .asObject(User.class); }) .as(RxLife.asOnMain(this)) //感知生命周期,自动关闭请求 .subscribe(user -> { //注册并且登录成功,拿到用户信息 }, throwable -> { //出现异常,注册失败或者登录失败 });
注:
RxHttp中的asXXX
系列方法,内部会默认开启IO线程执行Http请求,所以我们在发送单个请求时,无需指定请求执行线程;然而在多个请求串行时,为提升效率,我们希望一个线程可以执行多个请求,故我们需要使用subscribeOnCurrent
方法指定请求在当前线程执行。可以看到,这里我们使用
flatMap
操作符,当注册成功,就会走到flatMap内部去登录,登录成功就会拿到User对象并回调观察者。小结
看完你会发现,RxHttp做到了与RxJava的无缝连接,使用
asXXX
系列方法,就可以拿到一个Observable<T>
对象,随后再结合RxJava的merge
、flatMap
,就可以优雅的实现的Http请求的串行及并行。如果你对RxJava有一定的了解,还可以实现很多有意思的功能,比如:为单个请求设置超时、请求失败自动重试n次等等。最后,一切功劳都要归功于RxJava的强大,感谢RxJava,向它致敬!!!!
-
promise实现异步并行和异步串行
2019-08-19 10:22:56异步并行 promise.all(pronises);确保操作能并行执行,但是缺点,只要一个失败那就完蛋; 可以改进 const arr = [name1, name2, neme3]; all.map(functin(id) { return new Promise(function(resolve, rejict){})... -
并发编程之串行、并行和并发
2021-07-24 15:55:471.串行和并行 串行是指一个一个的做,并行是指多个一起做,如下图所示的传输案例,一个数据块一个数据块传输称为串行传输,多个数据块一起传输称为并行传输。 2.并发和并行 (1).并发 多个线程在一个处理器上交替... -
C++ 线程(串行 并行 同步 异步)详解
2020-12-31 22:43:17C++ 线程(串行 并行 同步 异步)详解 看了很多关于这类的文章,一直没有总结。不总结的话就会一直糊里糊涂,以下描述都是自己理解的非官方语言,不一定严谨,可当作参考。 首先,进程可理解成一个可执行文件的执行... -
并行转串行 串行转并行输出模块
2018-12-28 17:50:02并行转串行 串行转并行输出模块 夏宇闻Verilog 第15章学习...两个模块ptosda和out16hi,将ptosda并转串模块的串行输出给out16hi串转并模块,输出对应的高位电平 代码如下 //************************并行数据转一种... -
Rxjava+Retrofit实现串行和并行网络请求功能
2018-09-27 12:35:34这样串行和并行功能也就完成了。 第六:下面是在as上的具体使用实例。 public class MainActivity extends AppCompatActivity { private static final String TAG = "dasfhadksfhakf"; TangPoetryBean ... -
Ajax请求串行与并行问题
2018-10-10 19:02:09有三个ajax请求,如何让这三个ajax请求串行执行,即第一个执行完成后在执行另一个? 面试题2.如何让他们并行执行,然后三个请求都执行完成后,再执行某个操作? 其考察内容是同步和异步。 源网址 ... -
ajax请求串行和并行问题
2020-06-06 09:59:491.有三个ajax请求,如何让这三个ajax请求串行执行,即第一个执行完成后在执行另一个? 我回答的是判断上一个请求返回结果,执行完成之后在执行下一个,对吗? 2.如何让他们并行执行,然后三个请求都执行完成后,再... -
vue的Axios并行请求--Axios.all()
2021-09-01 15:29:58在做项目的过程中,可能会出现这样的场景:某个模块的数据后端是通过好几个接口分开给前端...于是乎~就想到了并行请求Axios.all()(所有请求同时进行,并且所有请求全部完成后再对数据进行处理),如下: 下面是官方例 -
promise实现多个请求并行串行执行
2018-05-11 10:49:00早上查资料,偶然发现这个话题,发现...想想之前我们用jquery写请求的时候,要实现请求的串行执行,我们可能是这么做的。 $.ajax({ url: '', data: '', success: function (data) { $.ajax({ url: '', data: ... -
spring 处理请求是串行得吗
2021-02-07 15:34:01 -
同步和异步vs串行和并行
2021-02-23 17:36:53将用户请求放入消息队列,并反馈给用户,系统添加购物车程序已经启动,你可以关闭浏览器或者关闭应 用程序了。后续程序会慢慢地去写入数据库中去。这就是异步和同步的差异。但是用户没有卡死的感觉, 一般会有系统... -
Js异步并行与串行
2019-06-14 06:34:22用普通函数和promise分别实现了两个版本的Js异步并行与串行。最关键的地方在与执行函数的实现,下面贴出代码来记录一把。 二、异步并行 class Executor { constructor() { this.tasks = []; this.tasksPromise =... -
异步协程框架SOA服务化调用支持并行串行调用请求合并
2019-08-07 17:41:23异步协程框架,SOA服务化调用,支持并行、串行调用、请求合并。支持异步日志,异步文件读写,异步Mysql,异步Redis,Mysql,Redis连接池 -
串行,并发与并行
2019-05-06 22:50:53串行 多个任务,执行时一个执行完再执行另一个。 比喻:吃完饭再看视频。 并发 多个线程在单个核心运行,同一时间一个线程运行,系统不停切换线程,看起来像同时运行,实际上是线程不停切换。 比喻: ... -
ajax请求串行和并行的问题
2017-05-30 23:48:571.有三个ajax请求,如何让这三个ajax请求串行执行,即第一个执行完成后在执行另一个? 2.如何让他们并行执行,然后三个请求都执行完成后,再执行某个操作? //串行执行分两种。 //一是用同步模式async: false,三个... -
Promise 并行和串行理解
2019-02-19 11:08:29promise主要是针对异步请求,这里...串行:一个异步请求完了之后在进行下一个请求 首先定义一些promise实例 并行: var promises = function () { return [1000, 2000, 3000].map(current => { return... -
ios GCD的实际串行和并行请求api调用
2018-09-07 16:03:52*前言:最近写的app需要综合用到api的串行和并行, 所以整理了下使用的api的情况。 主要用到的GCD方法:dispatch_group_leave, dispatch_group_enter, 以及semaphore的运用。* 1. 信号量串行顺序请求。... -
vue-Axios实现多个并行请求
2020-01-03 19:50:15// 存储后台响应每个请求后的返回结果 const resList = [] for (let i = 0; i ; i++) { var areaCode = citys.children[i].id const req = axios.get(process.env.BASE_API + '/api/rescure/sign/receive/... -
关于RxJS 处理多个Http请求 串行与并行方法
2019-10-09 05:34:17mergeMap mergeMap 操作符用于从内部的 Observable 对象中获取值,然后返回给父级流对象。 合并 Observable 对象 123456 import { of } from "rxjs";...const source$ = of("Hello... -
Jmeter性能测试8- 多个线程组的并行和串行
2021-03-10 15:09:181、勾选 Run Thread Groups ...2、不勾选Run Thread Groups consecutively(i.e.one at time),则表示并行执行。并行执行,指的是指的是测试计划中存在多个线程组时,所有线程组都在同一时刻执行 默认是不勾选的 ... -
js异步处理方案,js的异步串行与异步并行
2021-06-22 16:45:38文章目录js异步处理方案,js的异步串行与异步并行一、什么是串行,并行,并发二、实现异步串行三、实现异步并行 js异步处理方案,js的异步串行与异步并行 一、什么是串行,并行,并发 串行:这个就像队列一样,一个... -
RxHttp 优雅的实现请求串行与并行
2019-06-18 01:01:34现实开发中,一个页面很少只有一个请求的,一般都有多个请求,有的需要串行,有的需要并行,使用传统的方法,如果有n个接口,我们就要设置n个接口回调,如果是串行的话,还需要在当前接口成功或失败的地方,调用下个... -
promise的串行和并行
2019-11-20 15:47:39Promise 并行 这个功能Promise自身已经提供。主要是依赖**Promise.all**和**Promise.ra**ce。 Promise.all是所有的Promise执行完毕后(reject|resolve)返回一个Promise对象。 Promise.race是任意一个Promise对象... -
JobRequestor:Android库-方便地按职位管理您的网络请求。 构建一个离线优先的... 队列,串行,并行,缓存等
2021-04-28 15:12:27求职者 Job Requestor Android库-方便地按职位管理您的网络请求。 支持计划请求并行或串行,您还可以将请求分组并轻松缓存任何请求。 该库不包含任何网络请求库,它是一个MANAGE ... 如果发送并行请求,结果的返回顺 -
关于http请求串行问题的研究分析
2018-04-12 11:11:17主体代码:但是发现了一个奇怪的现象,在浏览器的多个窗口打开同一个路由到此Servlet的url,如http://localhost:8080/name,却发现这几个窗口的页面是串行打开的,请求耗时都是在前面请求的基...