当前位置: 首页 > news >正文

做销售网站要多少钱建立网站的流程

做销售网站要多少钱,建立网站的流程,无锡网站建设服务,池州家居网站建设怎么样前几天老板突然匆匆忙忙的过来说对账系统最近越来越慢了#xff0c;能不能快速优化一下#xff1f;我了解了对账系统的业务后#xff0c;发现还是挺简单的#xff0c;用户通过在线商城下单#xff0c;会生成电子订单#xff0c;保存在订单库。之后物流会生成派送单给用户…前几天老板突然匆匆忙忙的过来说对账系统最近越来越慢了能不能快速优化一下我了解了对账系统的业务后发现还是挺简单的用户通过在线商城下单会生成电子订单保存在订单库。之后物流会生成派送单给用户发货派送单保存在派送单库。为了防止漏送或重复派送对账系统每天还会校验是否存在异常订单。 对账系统的处理逻辑很简单你可以参考下面的对账系统流程图。目前的对账系统处理逻辑是首先查询订单然后查询派送单然后对比订单和派送单将差异写入差异库。 对账系统的代码抽象之后也很简单核心代码如下就是在一个单线程里循环查询订单、派送单然后执行对账最后写入差异库。 while(存在未对账的订单){//查询未对账订单pos getPRders();//查询派送单dos getDOrder();//执行对账操作diff chech(pos,dos);//差异写入差异库save(diff); }利用并行优化对账系统 老板要我优化性能那我就首先要找到这个对账系统的瓶颈所在。 目前的对账系统由于订单量和派送单量巨大所以查询对账订单getPOrders和查询派送单getDOrders相对较慢那有没有什么办法可以快速优化一下呢目前对账系统是单线程执行的。图形化后是下面这个样子对于串行化的系统性能优化首先想到的是能否利用多线程并行处理。 所以这里你应该所以这里你应该能够看出来这个对账系统里的瓶颈查询未对账订单getPOrder和查询派送订单getDOrder是否可以并行处理呢显然是可以的因为这两个操作并没有先后顺序的依赖这两个最耗时的操作并行执行之后执行过程如下图所示。对比一下单线程的执行示意图你会发现同等时间里并行执行的吞吐量近乎单线程的两倍。提升效果还是相对明显的。 思路有了下面我们再来看看如何利用代码实现。在下面的代码中我们创建了两个线程T1和T2并行执行查询未对账订单getPOrder和查询派送订单getDOrder这两个操作。在主线程中执行对账操作check和差异写入save两个操作不过要注意的是主线程需要等待线程T1和T2执行完才能执行check和save两个操作。为此我们通过调用T1.join和T2.join来实现等待。当T1和T2线程退出时。调用T1.join和T2.join的主线程就会从阻塞状态被唤醒从而执行之后的check和save。 while(存在未对账订单){//查询未对账订单Thread T1 new Thread(() -{pos getPOrder();});T1.start();//查询派送订单Thread T2 new Thread(()-{dos getDOrder();});T2.start();//等待T1 T2的结果T1.join();T2.join();//执行对账操作diff check(pos,dos);save(diff); }用CountDownLatch实现线程等待 经过上面的优化之后基本可以和老板汇报收工了但是有点美中不足相信你也发现了while循环里面每次都会创建新的线程而创建线程可是个耗时的操作所以最好是创建出来的线程能够循环利用。估计这时候你已经想到线程池了是的线程池就能解决这个问题。 而下面的代码就是利用线程池优化之后的我们首先创建一个固定大小为2的线程池之后在while循环里面重复利用一切看上去都很顺利。但是有个问题好像无解了那就是主线程如何知道getPOrder和getDOrder这两个操作什么时候执行完前面的主线程通过调用线程T1和T2的join方法来等待线程T1和T2退出但是在线程池的方案里线程根本不会退出所以join方法已经失效了。 //创建两个线程的线程池 Executor executor Executor.newFixedThreadPool(2); while(存在未对账订单){//查询未对账订单executor.execute(() -{pos getPOrder();});//查询派送订单executor.execute(()-{dos getDOrder();});/* 如何实现线程等待呢*///执行对账操作diff check(pos,dos);save(diff); }那如何解决这个问题呢你可以开动脑筋想出很多办法。最直接的办法是弄一个计数器初始值设置成2当执行完pos getPOrder();这个操作之后计数器减1执行完dos getDOrder();之后计数器也减1在主线程里等待计数器等于零当计数器等于零时说明这两个查询操作执行完了。等待计数器等于零其实就是一个条件变量用管程实现起来也很简单。 不过我并不建议你在实际项目中去实现上面的方案因为Java并发包里已经提供了实现类似功能的工具类CountDownLatch这里我们可以直接使用。下面的代码示例中在while循环里面我们首先创建了一个CountDownLatch计数器的初始值等于2。之后在pos getPOrder();和dos getDOrder();两个语句的后面对计数器执行减1操作。这个对计数器减1的操作是通过调用latch.countDown()来实现的。在主线程中我们通过调用latch.await()来实现对计数器等于0的等待。 Executor executor Executor.newFixedThreadPool(2); while(存在未对账订单){//计数器初始化未2CountDownLatch latch new CountDownLatch(2);//查询未对账订单executor.execute(() -{pos getPOrder();latch.countDown();});//查询派送订单executor.execute(()-{dos getDOrder();latch.countDown()});//等待连个查询操作结束latch.await();//执行对账操作diff check(pos,dos);save(diff); }进一步优化性能 经过上面的重重优化之后长出一口气终于可以交付了。不过在交付之前还需要再次审视一番看还有没有优化的余地仔细看还是有的。 前面我们将getPOrder和getDOrder这两个查询操作并行了但这两个查询操作和对账操作check save之间还是串行的。很显然这两个查询操作和对账操作也是可以并行的。也就是说在执行对账操作的时候可以同时去执行下一轮的查询操作这个过程可以形象的描述为下面这幅图。 那接下来我们再来思考一下如何实现这步优化两次查询操作都能够和对账操作并行。对账操作还依赖查询操作的结果这明显有点生产者-消费者的意思。两次查询操作是生产者对账操作是消费者。既然是生产者-消费者模型那就需要有个队列来保存生产者生产数据而消费者则从这个队列消费数据。 不过针对对账这个项目我设计了两个队列并且两个队列的元素之间还有对应关系具体如下图所示查询订单查询操作将订单查询结果插入订单队列派送单查询操作将派送单插入派送单队列这两个队列的元素之间是有一一对应的关系的。两个队列的好处是对账操作可以每次从订单队列出一个元素从派送单队列出一个元素然后对这两个元素执行对账操作这样数据一定不会乱掉。 下面再来看看如何利用双队列来实现完全的并行。一个最直接的想法是一个线程T1执行订单的查询工作一个线程T2执行派送单的查询工作当线程T1和T2都各自生产完一条数据的时候就通知线程T3执行对账操作。这个想法虽然看上去很简单但其实还隐藏着一个条件那就是线程T1和线程T2的工作步调要一致不能一个跑的太快一个跑的太慢。只有这样才能做到各自生产完一条数据的时候通知线程T3。 下面这幅图形象的描述了上面的意图线程T1和线程T2只有都生产完了一条数据的时候才能一起向下执行也就是说线程T1和线程T2还要相互等待步调要一致。同时线程T1和T2都生产完一条数据的时候还要能够通知线程T3执行对账操作。 用CyclicBarrier实现线程同步 下面我们就来实现上面提到的方案这两个方案的难点有两个一个是线程T1和T2要做到步调一致另一个是要能够通知到线程T3。 你依然可以利用一个计数器来解决这两个难点。计数器初始化为2线程T1和T2生产完一条数据都将计数器减1如果计数器大于0则线程T1或T2等待如果计数器等于零则通知线程T3并唤醒等待的线程T1和T2。与此同时将计数器重新置为2。这样线程T1和T2生产下一条数据的时候就可以继续使用这个计数器了。 同样还是建议你不要在实际项目中这么做因为Java并发包里也已经提供了相关的工具类CyclicBarrier。下面的代码中我们首先创建了一个计数器初始值为2的CyclicBarrier你需要注意的是创建CyclicBarrier的时候我们还需要传入一个回调函数当计数器减到0的时候会调用这个回调函数。 线程T1负责查询订单当查询出一条的时候调用barrier.await()来将计数器减1同时等待计数器变成0。线程T2负责查询派送订单当查询出一条时也调用barrier.await()来将计数器减1同时等待计数器变成0当T1和T2都调用barrier.await()的时候计数器会减到0当T1和T2此时T1和T2就可以执行下一条语句了同时还会调用的回调函数来执行对账操作。 非常值得一提的是CyclicBarrier的计数器有自动重置功能当减到零的时候会自动重置回你设置的初始值这个功能看用起来实在太方便了。 //订单队列 VectorP pos; //派送单队列 VectorP dos; //执行回调的线程池 Executor executor Executor.newFixedThreadPool(1); final CyclicBarrier barrier new CyclicBarrier(2,()-{executor.execute(() - check());});void check(){P p pos.remove(0);D d dos.remove(0);//执行对账操作diff check(p,d);save(diff); }void checkAll(){//查询未对账订单Thread T1 new Thread(() -{while(存在未对账订单{//查询订单库pos.add(getPOrder());//等待barrier.await();}});T1.start();//查询派送订单Thread T2 new Thread(() -{while(存在未对账订单{//查询订单库pos.add(getDOrder());//等待barrier.await();}});T2.start(); } 总结 CountDownLatch和CyclicBarrier是Java并发包提供的两个非常应用的线程同步工具类这两个工具类的用法区别在这里还是有必要再强调一下的。CountDownLatch主要用于解决一个线程等待多个线程的场景可以类比于旅游团长要等待所有的旅客到齐才能去下一个景点而CyclicBarrier是一组线程之间互相等待更像是几个驴友之间的不离不弃。
http://www.pierceye.com/news/276269/

相关文章:

  • .net商城网站模板下载网站开发怎么对接客户
  • php程序员网站开发域名企业备案对网站的好处
  • 沈阳市城乡建设网站wordpress全文
  • 冉冉科技网站建设网络教学平台网址
  • 深圳网站设计建设公司宁波易通建设网站
  • 许昌网站建设公司网站的空间和域名
  • 公司查询网站查询系统wordpress简书主题
  • 公司网站 钓鱼网站ui设计交付物都包含哪些
  • seo网站导航建设技巧精东影视传媒文化管理公司
  • 做白酒的网站怎么查网站建设是哪家公司
  • 网站域名密码免费网站推广产品
  • 网站建设一般要多少费用申请网站官网
  • 金融网站织梦模板二手车网站建设
  • 怎么自己写代码做网站做网站必须用域名吗
  • 重庆营销网站建设平台怎么添加wordpress模板
  • 网站赚取广告费深圳个人外贸网站建
  • 在线销售型的网站巢湖城市建设投资有限公司网站
  • 苏州高端网站建设设计程序源代码网站
  • 基本原理网站建设文档怎么做网站链接
  • 网站建设出售门户网站有哪些推广分类
  • 企业网站制作一般多少钱做ppt的兼职网站有哪些
  • 分公司可以建设网站淘宝联盟怎么推广
  • 苏州网站设计哪家公司好童程童美编程地址在哪里
  • 软文营销的成功案例百度优化怎么做
  • 公司网站开发怎么收费优化方案英语必修三
  • 网站改版阿里云怎么做网站301定向温州网站运营
  • 免费做简历网站有哪些网站建设与网页制作招聘
  • 怎么到国外网站去接模具订单做潍坊微信网站开发
  • 做船公司网站青海公司网站建设哪家好
  • 制作网站公司合同注意事项沈阳高端网站