精华内容
下载资源
问答
  • ESP8266多任务处理 ESP8266在运行过程中,只能一条线式的依次执行任务。但是我们在开发物联网项目时,可能需要ESP8266在执行某一任务的过程中,还能处理其它任务。比如,我们使用ESP8266来控制电机运行的同时,还...

    ESP8266多任务处理—Ticker库


    ESP8266在运行过程中,只能一条线式的依次执行任务。但是我们在开发物联网项目时,可能需要ESP8266在执行某一任务的过程中,还能处理其它任务。比如,我们使用ESP8266来控制电机运行的同时,还需要定时检查某一个引脚上连接按钮有没有被用户按下。

    • 为了解决以上问题,我们可以使用Ticker库来解决这一问题。下面我们来通过一系列示例程序向您讲解Ticker库的使用方法。
    示例1. Ticker库基本操作

    利用Ticker库,我们可以让ESP8266定时调用某一个函数。通过以下示例程序我们可以看到,ESP8266将会每隔一秒钟通过串口监视器输出一次信息。我们是通过语句ticker.attach(1, sayHi)来实现这一操作的。

    • 该语句中的attach函数有两个参数。第一个参数可控制调用函数的时间间隔,单位是秒。这里的数字1说明ESP8266将会每隔一秒钟调用一次函数。那么具体调用哪一个函数呢?这个函数名称正是是通过第二个参数来限定的。也就是名称为sayHi的函数。该函数将会让ESP8266定时通过串口监视器输出一次信息。信息内容是“Hi”后面跟一个数值。这个数值是为了标注sayHi函数被调
    展开全文
  • Java+CountDownLatch多任务处理优化

    千次阅读 2021-05-10 18:23:13
    二:多任务并行+线程池处理 上述简述了多任务并行的处理方式,首先频繁的创建、销毁对象是一个很消耗性能的事情; 如果用户量比较大,导致占用过多的资源,可能会导致我们的服务由于资源不足而宕机; 综上所述,在...

    前言

    项目有许多统计的功能,有些统计页面,要展示几个统计的结果,用户通过前台设置相关参数,后台实时统计并返回数据。后台查询正常查询结果是串行的。
    最好的用户体验,就是每一个操作都可以实时的展示数据,3秒之内应该是用户的忍受范围之内的了,所以做一款产品不仅要考虑用户交互设计,后端的优化也是比不可少的。
    举一个物流项目例子:
    1:统计订单量
    2:统计物流信息的时效
    3:统计客户下单量(按高到低排序)
    大家可以简单的看下以上这3项统计数据,总体来说,统计量还是不少的。最主要的还是要实时、实时、实时(重要的事情说三遍),显然定时任务是不现实的。

    优化前:
    程序的逻辑
    在这里插入图片描述
    优化后:
    程序的逻辑
    在这里插入图片描述

    并行常见如:发邮件通知,短信通知等。
    这里我们把并行的场景应用在统计这里。

    多任务并行处理,适用于多核CPU,单核CPU多线程执行任务可能会适得其反(上下文切换以及线程的创建和销毁都会消耗资源),特别是CPU密集型的任务。

    一:多任务并行处理

    代码实现:
    这里以demo实现,只需要把示例代码替换成业务代码即可

    public class CountDownLatch Test {
    
        final static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss");
    
        final static String beginTime = simpleDateFormat.format(new Date());
    
        public static void main(String[] args) throws Exception{
            CountDownLatch latch = new CountDownLatch(3);//
            Gaci gaci1 = new Gaci("任务1", 1000, latch);
            Gaci gaci2 = new Gaci("任务2", 2000, latch);
            Gaci gaci3 = new Gaci("任务3", 2000, latch);
    
            gaci1.start();// 任务1开始执行
            gaci2.start();// 任务2开始执行
            gaci3.start();// 任务3开始执行
    
            latch.await();// 等待所有任务结束
            System.out.println("所有的统计任务执行完成:" + simpleDateFormat.format(new Date()));
    
        }
        static class Gaci extends Thread {
            String gaciName;// 名称
            int runTime;// 模拟业务代码运行时间
            CountDownLatch latch;// latch
    
            public Gaci(String gaciName, int runTime, CountDownLatch latch) {
                this.gaciName = gaciName;
                this.runTime = runTime;
                this.latch = latch;
            }
    
            public void run() {
                try {
                    System.out.println(gaciName+ " begin  "+ beginTime);
                    // 模拟任务执行时间
                    // 执行业务代码
                    System.out.println(gaciName+ " service code  "+ beginTime);
                    Thread.sleep(runTime);
                    System.out.println(gaciName + " end "+ simpleDateFormat.format(new Date()));
                    latch.countDown();// 单次任务结束,计数器减一
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    在这里插入图片描述

    它会等所有任务结束之后,再往下走后面的代码,这个时候你就可以封装数据返回给前端了。

    由于我们的业务是要同步返回统计数据的,所以定时任务,队列等不适用,我们使用到的是CountDownLatch,看源码,是jdk1.5新增的特性,提供的并发工具类.
    在这里插入图片描述

    CountDownLatch主要用于同步一个或多个任务,强制它们等待,由其他任务执行的一组操作完成。CountDownLatch典型的用法是将一个程序分为N个互相独立的可解决任务,并创建值为N的CountDownLatch(new CountDownLatch(N),N代表多少个任务)。当每一个任务完成时,都会在这个锁存器上调用countDown(latch.countDown(),代表当前任务已经执行完,计数器减一,直到计数器减完。),等待问题被解决的任务调用这个锁存器的await,将他们自己拦住,直至锁存器计数结束。
    我们解释下我们的demo代码。
    首先我们创建CountDownLatch
    3个任务

      CountDownLatch latch = new CountDownLatch(3);
    

    然后我们定义3个任务执行

     Gaci gaci1 = new Gaci("任务1", 1000, latch);
     Gaci gaci2 = new Gaci("任务2", 2000, latch);
     Gaci gaci3 = new Gaci("任务3", 2000, latch);
    
     gaci1.start();// 任务1开始执行
     gaci2.start();// 任务2开始执行
     gaci3.start();// 任务3开始执行
    

    我们先看看任务执行代码,我们每一个任务最后都会有一个latch.countDown()方法,这个方法就是上述文字写的,代表当前任务已经执行完,计数器减一

            try {
                    System.out.println(gaciName+ " begin  "+ beginTime);
                    // 模拟任务执行时间
                    // 执行业务代码
                    System.out.println(gaciName+ " service code  "+ beginTime);
                    Thread.sleep(runTime);
                    System.out.println(gaciName + " end "+ simpleDateFormat.format(new Date()));
                    latch.countDown();// 单次任务结束,计数器减一
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    

    我们再往下看

     latch.await();// 等待所有任务结束
     System.out.println("所有的统计任务执行完成:" + simpleDateFormat.format(new Date()));
     latch.await();
    

    就是说的上述拦住上面的任务,等所有任务执行完成之后,再往下走。

    二:多任务并行+线程池处理

    上述简述了多任务并行的处理方式,首先频繁的创建、销毁对象是一个很消耗性能的事情;
    如果用户量比较大,导致占用过多的资源,可能会导致我们的服务由于资源不足而宕机;
    综上所述,在实际的开发中,这种操作其实是不可取的一种方式。
    线程池中线程的使用率提升,减少对象的创建、销毁;
    线程池可以控制线程数,有效的提升服务器的使用资源,避免由于资源不足而发生宕机等问题;
    理论上来讲,线程越多程序可能更快,但是在实际使用中我们需要考虑到线程本身的创建以及销毁的资源消耗,以及保护操作系统本身的目的。我们通常需要将线程限制在一定的范围之类,线程池就起到了这样的作用。
    继续优化后:
    在这里插入图片描述
    首先我们了解下Java的线程池
    Java的Executors的四种线程池介绍:
    1:newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
    2:newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
    3:newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
    4:newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

    使用线程池的优点
    1:可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
    2:提供定时执行、定期执行、单线程、并发数控制等功能。
    3:重用存在的线程,减少对象创建、消亡的开销,性能佳。

    4种线程池的优缺点:
    1:newCachedThreadPool
    不足:这种方式虽然可以根据业务场景自动的扩展线程数来处理我们的业务,但是最多需要多少个线程同时处理缺是我们无法控制的;
    优点:如果当第二个任务开始,第一个任务已经执行结束,那么第二个任务会复用第一个任务创建的线程,并不会重新创建新的线程,提高了线程的复用率;
    2:newFixedThreadPool
    优点:newFixedThreadPool的线程数是可以进行控制的,因此我们可以通过控制最大线程来使我们的服务器打到最大的使用率,同事又可以保证及时流量突然增大也不会占用服务器过多的资源。
    3:newScheduledThreadPool
    讲两点:
    3.1 scheduleAtFixedRate
    如果间隔时间大于任务的执行时间,任务不受执行时间的影响。如果间隔时间小于任务的执行时间,那么任务执行结束之后,会立马执行,至此间隔时间就会被打乱。
    3.2 scheduleWithFixedDelay
    间隔时间不会受任务执行时间长短的影响
    4:newSingleThreadExecutor
    这是一个单线程池,至始至终都由一个线程来执行。

    直接上代码实现:

    public class CountDownLatchTest {
    
        final static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss");
    
        final static String beginTime = simpleDateFormat.format(new Date());
    
        /**
         * IO密集型任务:  线程个数为CPU核数的两倍。到其中的线程在IO操作的时候,其他线程可以继续
         * 用cpu,提高了cpu的利用率 
         * 一般为2*CPU核心数(常出现于线程中:数据库数据交互、文件上传下载、网络数据传输等等)
         * CPU密集型任务: 线程个数为CPU核数。这几个线程可以并行执行,不存在线程切换到开销,提
         * 高了cpu的利用率的同时也减少了切换线程导致的性能损耗
         * 一般为CPU核心数+1(常出现于线程中:复杂算法)
         * 混合型任务:视机器配置和复杂度自测而定
         */
        private static int corePoolSize = Runtime.getRuntime().availableProcessors();
        /**
         * public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,
         *                           TimeUnit unit,BlockingQueue<Runnable> workQueue)
         * 参考源码参数代表什么意思
         * corePoolSize 指定核心线程数量
         * maximumPoolSize 指定最大线程数
         * keepAliveTime和TimeUnit 指定线程空闲后的最大存活时间
         * workQueue 这是线程池的缓冲队列,还未执行的线程会在队列中等待,监控队列的长度,确保队列是有界限的
         * 不适当的线程池大小会使得处理速度变慢,稳定性下降,并且导致内存泄露。如果配置的线程过少,则队列会持续变大,消耗过多内存。
         * 而过多的线程又会由于频繁的上下文切换导致整个系统的速度变缓。队列的长度重要,它必须得是有界限的,这样如果线程池不堪重负了它可以暂时拒绝掉新的请求。
         * ExecutorService 默认的实现是一个无界的 LinkedBlockingQueue。
         */
        private static ThreadPoolExecutor executor  = new ThreadPoolExecutor(corePoolSize, corePoolSize+1, 10l, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(1000));
    
        public static void main(String[] args) throws Exception{
    
    //        CountDownLatch latch = new CountDownLatch(3);//
    //        Gaci gaci1 = new Gaci("任务1", 1000, latch);
    //        Gaci gaci2 = new Gaci("任务2", 2000, latch);
    //        Gaci gaci3 = new Gaci("任务3", 2000, latch);
    //
    //        gaci1.start();//任务1开始执行
    //        gaci2.start();//任务2开始执行
    //        gaci3.start();//任务3开始执行
    //
    //        latch.await();// 等待所有任务结束
    //        System.out.println("所有的统计任务执行完成:" + simpleDateFormat.format(new Date()));
    
            // 线程池方式 -- start
            CountDownLatch latch = new CountDownLatch(3);
            //使用execute方法
            executor.execute(new Gaci("任务1", 1000, latch));
            executor.execute(new Gaci("任务2", 1000, latch));
            executor.execute(new Gaci("任务3", 2000, latch));
    
            latch.await();// 等待所有任务结束
            System.out.println("所有的统计任务执行完成:" + simpleDateFormat.format(new Date()));
            // 线程池方式 -- end
            executor.shutdown();
        }
        static class Gaci extends Thread {
            String gaciName;// 名称
            int runTime;// 模拟业务代码运行时间
            CountDownLatch latch;// latch
    
            public Gaci(String gaciName, int runTime, CountDownLatch latch) {
                this.gaciName = gaciName;
                this.runTime = runTime;
                this.latch = latch;
            }
    
            public void run() {
                try {
                    System.out.println(gaciName+ " begin  "+ beginTime);
                    //模拟任务执行时间
                    // 执行业务代码
                    System.out.println(gaciName+ " service code  "+ beginTime);
                    Thread.sleep(runTime);
                    System.out.println(gaciName + " end "+ simpleDateFormat.format(new Date()));
                    latch.countDown();//单次任务结束,计数器减一
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    执行效率对比
    效率如下:
    多线程并行任务+线程池-》多线程并行任务-》单线程串行

    countDownLatch源码分析后续补上

    展开全文
  • 多任务处理:同一个时间内计算机系统中如果允许多个进程同时处于运行状态,这便是多任务。 多重处理:对于有多个CPU的计算机,同时在每一个CPU上执行进程称为多重处理。 只有一个CPU的计算机,操作系统可以进行多...
    • 多任务处理:同一个时间内计算机系统中如果允许多个进程同时处于运行状态,这便是多任务。
    • 多重处理:对于有多个CPU的计算机,同时在每一个CPU上执行进程称为多重处理。

    只有一个CPU的计算机,操作系统可以进行多进程并发执行,实现多任务处理。如果一台有多个CPU的计算机,操作系统既能进行多任务处理又能进行多重处理。

    可不可以理解为:
    多任务相当于并发?
    而多重任务相当于并行?

    展开全文
  • 单用户操作系统是指一台计算机在同一时间只能由一个用户使用,一个用户独自享用系统的全部硬件和软件资源,而如果在同一时间允许个用户同时使用计算机,则称为用户操作系统。另外,如果用户在同一时间可以...

    关于单用户操作系统包括Microsoft

    的MS DOS,windows 9X(95,98,ME),windows 2000。

    根据在同一时间使用计算机用户的多少,操作系统可分为单用户操作系统和多用户操作系统。单用户操作系统是指一台计算机在同一时间只能由一个用户使用,一个用户独自享用系统的全部硬件和软件资源,而如果在同一时间允许多个用户同时使用计算机,则称为多用户操作系统。

    另外,如果用户在同一时间可以运行多个应用程序(每个应用程序被称作一个任务),则这样的操作系统被称为多任务操作系统。如果一个用户在同一时间只能运行一个应用程序,则对应的操作系统称为单任务操作系统。

    现代操作系统一般属于多用户的操作系统,也就是说,同一台机器可以为多个用户建立各自的账户,也允许拥有这些账户的用户同时登录这台计算机。这就涉及到计算机用户和资源的管理。简单地说就是多个用户在一台电脑上可以建立多个用户,而如果1台电脑只能使用一个用户的话,就称之为单用户。

    多个用户能够同时访问和使用这同一台计算机,其中的一个用户具有管理所有这些用户账户和整个计算机的资源的权限,在Windows上,这个具有管理其他用户和计算机资源的用户一般叫administrator。

    个人计算机操作系统是单用户操作系统,其主要特点是在某一时间为单个用户服务。

    早期的DOS操作系统是单用户单任务操作系统,Windows XP 则是单用户多任务操作系统,Linux 、UNIX是多用户多任务操作系统。

    现在常用的Windows操作系统都是多用户的操作系统,早期的DOS操作系统是单用户单用户操作系统,使用最广泛的的win7是多用户操作系统,其次还包括如UNIX、Linux操作系统属多用户多任务操作系统。关于单用户操作系统包括Microsoft

    的MS DOS,windows 9X(95,98,ME),windows 2000。

    取消

    评论

    展开全文
  • 深度学习中的多任务学习介绍

    千次阅读 2021-03-27 15:11:22
    在2017年有一篇关于在深度神经网络中多任务学习概述的论文:《An Overview of Multi-Task Learning in Deep Neural Networks》,论文链接为:https://arxiv.org/pdf/1706.05098.pdf,它介绍了在深度学习中多任务学习...
  • Linux -- 多任务机制(任务、进程、线程)介绍

    千次阅读 多人点赞 2021-10-18 17:40:01
    多任务处理是指用户可以在同一时间内运行多个应用程序,每个正在执行的应用程序被称为一个任务。 Linux就是一个支持多任务的操作系统,多任务操作系统使用某种调度策略支持多个任务并发执行。事实上。(单核)处理器...
  • 由于智能的标志之一是学习和存储任务,因此如何在任务上训练神经网络(并解决灾难性遗忘)的问题极为重要。 有一种想法是改变训练数据,使每项任务的训练样本相互交错。例如,假设我们有 3 个任务
  • 在win10系统里,有些应用跟随计划任务一起启动,但又不想这些应用启动,这是我们可以通过禁用计划任务来阻止应用启动,那么win10怎么禁用计划任务呢,其实方法很简单,下面小编给大家分享win10计划任务的关闭方法。...
  • spring schedule 配置多任务动态 cron 【增删启停】

    千次阅读 热门讨论 2021-03-13 21:47:38
    之前公司经常会遇到配置定时任务,简单的任务可以直接依赖spring即可。简单任务直接使用 @scheduled 注解配合@EnableScheduling,即可。 开发原则是: 在满足项目需求的情况下,尽量少的依赖其它框架,避免项目过于...
  • 文章目录前言一、Motivation二、网络结构分析三、实验结果分析四、总结与反思五、参考文献 前言 论文:Transformer is all you need:...Transformer首先应用于sequence-to-sequence模型的自然语言处理领域。随着Tr
  • java并行执行任务

    千次阅读 2021-02-26 15:16:37
    java并行执行任务:最近做项目中,有个任务需要实现并发编程,个人参考了下网上的实现,自己实现了下并发方法,并且增加了简单的说明,希望的有需要的朋友有些帮助。import java.util.UUID;import java.util....
  • 在流程定义中,userTask节点的assignee什么也不配,通过指定一个任务监听器,在监听器中动态指定多人任务一、多人任务分配方式act_ru_identitylink 表存放任务的办理人,包括个人任务和组任务,表示正在执行的任务...
  • 但是,使用离线强化学习(RL)(智能体使用以前收集的数据开展训练,在试验和错误中学习的一种方法)来训练,即使是一个单一任务(例如抓取),也可能需要花费成千上万个机器人小时,此外还需要大量的工程来大规模实现...
  • YARN——任务运行异常处理

    千次阅读 2021-04-28 00:55:14
    【概述】上篇文章讲述了yarn任务提交运行的流程,本文来聊聊整个运行过程中的一些异常情况,以及yarn是如何处理的。【container进程异常】在NM内部,对于container进程的启...
  • 目录 基础理论 一、生成验证码数据集 1、生成验证码训练集 1-0、判断文件夹是否为空 1-1、创建字符集(数字、大小写英文字母) ...3、处理每条数据 4、自定义重复周期和批次大小 5、处理每批数据 6、获取一批
  • 在多个领域中,可以利用多任务学习来提高效果或者性能,比如垃圾邮件过滤、网页检索、自然语言处理、图像识别、语音识别等等。 文章目录``多任务学习可以运用到许多的场景。``相关任务多任务学习二分类多分类多标签...
  • 无人机图像优化工具主要用于批量处理无人机航拍影像,提升影像在阴天、雾天、傍晚等不良天气情况下成像效果。处理后影像完全保留影像原始属性信息,如相机型号、分辨率、定位信息等,减少对后续处理的影响。另外,在...
  • 多任务学习算法系列的主要内容是回顾和总结自己2019-2021间在深度学习多任务学习算法(multitask)的工业实践和遇到的常见问题,欢迎更多同学讨论和指正,同时也宣传一波我们组在推荐方向的工作成果——大规模推荐算...
  • 能使系统中台计算机相互协作完成一件任务的操作系统是(19)。A.批处理操作系统B.分时操作系统C.当计算机网络中的某个计算系统负荷过重时,可以将其处理任务传送到网络中的其他计算机系统中,以提互联的各计算机...
  • LeetCode 1882 使用服务器处理任务

    千次阅读 2021-05-31 20:15:22
    题目链接 给你两个 下标从 0 开始 的整数数组 servers 和 tasks ,长度分别为 n​​​​​​ ...第 0 项任务在第 0 秒可以开始处理,相应地,第 j 项任务在第 j 秒可以开始处理处理第 j 项任务时,你需要为它分配一台
  • 定时任务使用线程注意事项

    千次阅读 2021-03-22 18:08:17
    在定时任务中为了加快处理速度,一般都会使用线程处理业务。需要注意一下事项:1. 定时任务是否允许上一个定时任务未结束,下一个定时任务可以启动,通过Scheduled中的配置在决定。2. 主线程已经关闭,线程池中的...
  • 中断和中断处理流程

    千次阅读 2020-12-20 04:41:20
    1. 中断概念中断是指由于接收到来自外围硬件(相对于中央处理器和内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器...
  • 针对此问题,查阅了网上很资料,好多都使用线程来处理。跟着好多的博客进行处理,要么是线程安全问题,要么根本速度就提高不了。我针对我项目中的使用场景,结合资料进行了修改,特提交此文,为有共同需求的小...
  • 文章目录Dataflow编程执行图并行度数据传输策略任务链 Dataflow编程 顾名思义,Dataflow程序描述了数据如何在不同操作之间流动。Dataflow程序通常表现为有向无环图(DAG),图中顶点称为算子(Operator),表示计算...
  • 【延时任务处理、订单失效】RabbitMQ死信队列实现

    万次阅读 多人点赞 2020-12-18 09:48:26
    对于这种问题一般有两种解决方案:定时任务处理,延时任务处理 定时任务处理 用户下订单后先生成订单信息,然后将该订单加入到定时任务中(30分钟后执行),当到达指定时间后检查订单状态,如果未支付则标识该订单...
  • 我们算法组陆陆续续做了HTZQ的81个大类的序列标注任务,个人这边做了接近30个类别的NER任务,属实是试验了多种多样的NER方案,感受颇。接下来我这边针对金融领域上市公司的公告数据中的实体识别任务,进行简单总结...
  • Java线程池并发执行任务

    千次阅读 2021-02-26 13:15:19
    Java在语言层面提供了线程的支持,线程池能够避免频繁的线程创建和销毁的开销,因此很时候在项目当中我们是使用的线程池去完成线程的任务。Java提供了Executors 框架提供了一些基础的组件能够轻松的完成线程...
  • C#异步线程Task的介绍和使用,从相关关键字到使用示例,详细解析Task和TaskCompletionSource的使用方法。
  • 文章已上传至资源区可直接下载(机器人系统动态任务分配策略研究综述) 一、介绍 机器人协作系统是机器人学中最广泛的研究领域之一,机器人系统(MRS)以协调的方式部署个合作机器人来执行和完成任务。 MRS...
  • OpenCV视频流的C++线程处理方式

    千次阅读 2021-01-14 11:20:08
    目录为什么需要线程处理视频流C++的线程处理方式函数封装的实现方式类封装的实现方式可能遇到的问题 为什么需要线程处理视频流 在之前有写过一篇文章Python环境下OpenCV视频流的线程处理方式,上面简单记录...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,510,262
精华内容 604,104
关键字:

多任务如何处理