-
2022-05-10 16:03:58
之前有付费读者提出想要对自然语言处理的相关任务进行详细的了解。为了帮助他们对该部分内容有更深的理解,所以特意写了该博客。
之前博客提到了自然语言处理的任务包括基础自然语言任务、信息抽取任务、文本生成任务和其他应用任务。那么本节课将对上述任务进行详细的介绍。
更多相关内容 -
多线程异步任务处理
2018-11-07 21:29:31文章目录多线程异步任务处理线程池线程池的优缺点常用的线程池技术@Async注解源码 我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,那我们怎么去使用它呢?我们先来了解下什么是...@(多线程&&并发)
多线程异步任务处理 欢迎关注作者博客
简书传送门
我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,那我们怎么去使用它呢?我们先来了解下什么是线程池?线程池
线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程。线程池中线程的数量通常完全取决于可用内存数量和应用程序的需求。然而,增加可用线程数量是可能的。线程池中的每个线程都有被分配一个任务,一旦任务已经完成了,线程回到池子中并等待下一次分配任务。
线程池的优缺点
使用线程池管理线程的优点:
- 线程的创建和销毁由线程池维护,一个线程在完成任务后并不会立即销毁,而是由后续的任务复用这个线程,从而减少线程的创建和销毁,节约系统的开销
- 线程池旨在线程的复用,这就可以节约我们用以往的方式创建线程和销毁所消耗的时间,减少线程频繁调度的开销,从而节约系统资源,提高系统吞吐量
- 在执行大量异步任务时提高了性能
- Java内置的一套ExecutorService线程池相关的api,可以更方便的控制线程的最大并发数、线程的定时任务、单线程的顺序执行等
常用的线程池技术
- Executors.newCacheThreadPool():可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用。如果没有,就建一个新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型任务。
- Executors.newFixedThreadPool(int n):创建一个可重用固定个数的线程池,以共享的无界队列方式来运行这些线程。
- Executors.newScheduledThreadPool(int n):创建一个定长线程池,支持定时及周期性任务执行。
- Executors.newSingleThreadExecutor():创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
@Async注解
在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。
如何在Spring中启用@Async。基于Java配置的启用方式:@Configuration @EnableAsync public class ExecutorConfig { }
源码
配置类:
/** * @program: * @description: 线程池配置类 * @author: zhouzhixiang * @create: 2018-11-07 19:10 */ @Configuration @EnableAsync public class ExecutorConfig { @Bean public Executor asyncServiceExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //配置核心线程数 executor.setCorePoolSize(20); //配置最大线程数 executor.setMaxPoolSize(20); //配置队列大小 executor.setQueueCapacity(99999); //配置线程池中的线程的名称前缀 executor.setThreadNamePrefix("async-service-"); // rejection-policy:当pool已经达到max size的时候,如何处理新任务 // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //执行初始化 executor.initialize(); return executor; } }
接口:
/** * @program: * @description: 异步接口 * @author: zhouzhixiang * @create: 2018-11-07 19:08 */ public interface AsyncService { public void testAsync(); }
实现类:
/** * @program: * @description: * @author: zhouzhixiang * @create: 2018-11-07 19:08 */ @Service public class AsyncServiceImpl implements AsyncService { private static final Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class); @Override @Async("asyncServiceExecutor") public void testAsync() { try{ Thread.sleep(10000); logger.info("start executeAsync"); System.out.println("测试异步任务!"); } catch (InterruptedException e) { e.printStackTrace(); } logger.info("end executeAsync"); } }
controller:
@ApiOperation(value = "business-测试", notes = "business-测试") @PostMapping("test") public ServiceResponse test2(@RequestBody JSONObject jsonObject, HttpServletRequest req){ businessService.test(); ServiceResponse response = new ServiceResponse(); response.setCode(200); response.setData("成功"); return response; }
控制台输出:
由下图可以看出,异步任务执行成功。
想提升编码能力吗,扫码购买提升逼格!
欢迎加入Java猿社区
-
什么是多任务?什么叫做进程?什么是线程?
2017-01-24 09:27:57多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务.Linux、windows就是支持多任务的操作系统,比起单任务系统它的功能增强了许多。 当多任务操作系统使用某种任务调度策略允许两个或...1、什么叫做多任务?
IT系统,同时完成多项任务处理,这个同时指的是同一段时间内,而不是同一瞬时。
多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务.Linux、windows就是支持多任务的操作系统,比起单任务系统它的功能增强了许多。
当多任务操作系统使用某种任务调度策略允许两个或更多进程并发共享一个处理器时,事实上处理器在某一时刻只会给一件任务提供服务。因为任务调度机制保证不同任务之间的切换速度十分迅速,因此给人多个任务同时运行的错觉。多任务系统中有3个功能单位:任务、进程和线程。
多任务处理是指设备同时运行多个程序的能力。多任务的一般方法是运行第一个程序的一段代码,保存工作环境;再运行第二个程序的一段代码,保存环境;……恢复第一个程序的工作环境,执行第一个程序的下一段代码……现代的多任务,每个程序的时间分配相对平均。
一个线程是指程序的一条执行路径,它在系统指定的时间片中完成特定的功能。系统不停地在多个线程之间切换,由于时间很短,看上去多个线程在同时运行。或者对于在线程序可并行执行同时服务于多个用户称为多任务处理。2、什么是进程?谈谈你对进程的理解?
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。[
进程和线程都是由操作系统所体现的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
进程和线程的区别在于:
简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出 口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
进程是一个具体的应用程序,线程是进程中的一个分支,为单独完成程序中的某一项或一组功能而存在。
应用程序可以有一个或多个进程,一个进程可以有一个或多个线程,其中一个是主线程(线程是进程中的实体,一个线程必须有一个父进程).3、什么叫做并发执行
1、并发运行就是让计算机同时运行几个程序或同时运行同一程序多个进程或线程。
2、早期的计算机只具有一个中央处理器(CPU)并且是单核(只有一个运算器)的,这种情况下计算机操作系统采用并发技术实现并发运行,具体做法是采用“ 时间片轮询进程调度算法”,它的思想简单介绍如下: 在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10毫秒),这样用户根本感觉不出来CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样。但实际上在任何一个时间内有且仅有一个进程占有CPU及CPU的运算器。
3、现阶段许多计算机具有多个中央处理器或一个处理器具有多个运算器(多核),情况就不同了,如果进程数小于CPU或运算器数,则不同的进程可以分配给不同的CPU或运算器来运行,这样,各个进程就是真正同时运行的,这便是并行。但如果进程数大于CPU或运算器数,则仍然需要使用并发技术。
4、有些操作系统并不支持多个CPU或多核CPU,如 ms winodws 9x、3.x,这样的操作系统多个CPU、或多核CPU对它们来说是无用的。4、什么叫做线程?
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。线程的引入:
60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是由于对称多处理机(SMP)出现,可以满足多个运行单位,而多个进程并行开销过大。
因此在80年代,出现了能独立运行的基本单位——线程(Threads)。
-
Java多线程并行处理任务的实现
2019-04-20 21:08:02Java多线程并行处理任务的实现 在实际项目开发的过程中,遇到过需要处理一个由多个子任务组成的任务的问题.顺序处理起来会造成响应时间超长,用户体验不好的问题.我想到一个解决方案,即使用多线程并行处理子任务.思路...Java多线程并行处理任务的实现
在实际项目开发的过程中,遇到过需要处理一个由多个子任务组成的任务的问题.顺序处理起来会造成响应时间超长,用户体验不好的问题.我想到一个解决方案,即使用多线程并行处理子任务.思路就是使用ThreadPoolExecutor线程池,然后使用一个list保存所有线程的实例引用.以下是代码实现.
以下是代码实现
FactorialCalculator 类:用于实现具体的业务处理
package ThreadTask; import java.util.concurrent.Callable; public class FactorialCalculator implements Callable<Integer> { private int number; public FactorialCalculator(int number) { this.number = number; } //计算阶乘 public Integer call() throws Exception { Integer result = 1; if (number == 0 || number == 1) result = 1; else { for (int i = 2; i <= number; i++) { result *= i; //为了演示效果,休眠20ms Thread.sleep(20); } } System.out.printf("线程:%s," + number + "!= %d\n", Thread.currentThread().getName(), result); return result; } }
Main 类:用于实现多线程任务的实现和处理
import ThreadTask.FactorialCalculator; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadPoolExecutor; public class Main { public static void main(String[] args) { Long startTime = System.currentTimeMillis(); ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);//创建只有2个线程的线程池 //存放结果的列表 List<Future<Integer>> resultList = new ArrayList<>(); //通过Random类生成一个随机数生成器 Random random = new Random(); for (int i = 0; i < 10; i++) { int number = random.nextInt(10); FactorialCalculator calculator = new FactorialCalculator(number); Future<Integer> result = executor.submit(calculator); resultList.add(result); } //创建一个循环来监控执行器的状态 try { while (executor.getCompletedTaskCount() < resultList.size()) { System.out.printf("\n已完成的线程数量: %d\n", executor.getCompletedTaskCount()); for (int i = 0; i < resultList.size(); i++) { Future<Integer> result = resultList.get(i); System.out.printf("第 %d 个线程 : 是否完成:%s\n", i, result.isDone()); } Thread.sleep(50); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("全部线程执行结束"); try { for (int i = 0; i < resultList.size(); i++) { Future<Integer> result = resultList.get(i); Integer number = null; number = result.get(); System.out.printf("第 %d 个线程 执行结果是: %d\n", i, number); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } executor.shutdown(); Long endTime = System.currentTimeMillis(); System.out.println("使用时间 = [" + (endTime - startTime) + "]"); } }
-
python使用多进程高效处理任务
2022-05-05 14:21:59通常我们使用的程序都是单进程的,就好比我们只有一个工人在搬运货物,一次一次地来回搬运,多线程则是多个工人同时在搬运货物。而我们的电脑很多都是八核甚至是十六核的,平时我们写的程序就只是单进程在运行,其余... -
抢占式多任务处理 vs 协作式多任务处理
2013-04-11 14:07:58抢占式多任务处理是计算机操作系统中,一种实现多任务处理的方式,相对于协作式多任务处理而言。协作式环境下,下一个进程被调度的前提是当前进程主动放弃时间片;抢占式环境下,操作系统完全决定进程调度方案,操作... -
-
多节点服务器定时任务重复处理的问题
2017-08-20 23:02:50项目中有使用Spring定时执行任务的需求,用户可以自定义时间(半小时或整点)去生成需要的报表并发送邮件到用户自己的邮箱。 项目里面提供的时间是半小时或整点去执行Spring定时任务,查询数据库中有哪些Schedule是... -
多任务学习
2018-01-12 16:35:45多任务学习(Multitask learning)是迁移学习算法的一种,迁移学习可理解为定义一个一个源领域source domain和一个目标领域(target domain),在source domain学习,并把学习到的知识迁移到target domain,提升... -
一个简单的分阶段多任务处理实例
2012-08-23 09:52:09我们经常需要处理一个很耗时的任务,一般只有其中几步是十分耗时的,此时我们想到的是多线程来处理此任务。但是往往我们不能简单地把整个任务弄成多线程程序。如:文件的读取,文件的写入需要单线程处理(如果多线程... -
springboot之多任务并行+线程池处理
2018-05-14 16:20:34最近项目中做到一个关于批量发短信的业务,如果用户量特别大的话,不能使用单线程去发短信,只能尝试着使用多任务来完成!我们的项目使用到了方式二,即Future的方案 Java 线程池 Java通过Executors提供四... -
php利用多进程处理任务
2018-12-17 11:37:23php利用多进程处理任务 注:php多进程一般应用在php_cli命令行中执行php脚本,做进程任务时要检查php是否开启了pcntl扩展,(pcntl是process control进程管理的缩写) pcntl_fork — 在当前进程当前位置产生分支... -
Android安全防护的「多任务窗口中的界面高斯模糊处理」其实是个骗局?
2018-07-09 08:33:53一、情景介绍应用开发过程中安全问题的确需要系统考虑也要开发者自己多考虑,一个小的细节可能会让你的应用变的更安全,最近在用招商银行App的时候无意中发现了iPhone上多任... -
线程基础:多任务处理(12)——Fork/Join框架(基本使用)
2017-05-14 12:34:14ForkJoinPool由Java大师Doug Lea主持编写,它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。本文中对Fork/Join框架的讲解,基于JDK1.8+中的Fork/Join框架... -
Java多线程之运行多个任务并处理所有结果
2018-08-23 23:13:47执行器框架给我们提供了一个方法,让我们可以发送给执行器一个任务列表,并等待任务列表中的所有任务执行完毕。然后它将返回一个与任务列表对应的Future列表。 package com.primer.demo.util; import lombok.... -
PHP多进程处理并行处理任务实例
2015-07-22 15:15:40本文通过例子讲解linux环境下,使用php进行并发任务处理,以及如何通过pipe用于进程间的数据同步。写得比较简单,作为备忘录。 PHP多进程 通过pcntl_XXX系列函数使用多进程功能。注意:pcntl_XXX只能运行在... -
ScheduledExecutorService:多线程任务调度
2018-08-09 19:45:44多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。 建议多线程-任务调度,使用如下方式: 首先... -
java8_CompletableFuture_异步执行多个任务
2018-12-05 21:35:241)聚合多个异步任务 需求:多个tab页包含不同的表格数据,并且带分页,页面首次加载时需要显示第一页数据,并且在tab顶上显示总量,如下图所示: 各个表格数据从es中查询,涉及到计算,此处可以让前端调用多个... -
深度学习笔记(19) 多任务学习
2019-06-16 08:47:49多任务学习概念、物体检测的多任务学习、多任务学习的条件 -
线程池使用ExecutorService 多线程处理队列任务
2017-09-03 22:48:45接下来说一种非常实用的多线程操作模式,此方式能够应对大部分的多线程操作,稍微改一下往里面套就可以满足大部分的业务需求。 基本方式是: 使用ExecutorService 管理多线程,使用Executors创建newFixedThrea -
多分类任务的混淆矩阵处理
2018-09-26 20:43:49多分类任务的混淆矩阵处理 在多分类任务中,不适合使用PR曲线和ROC曲线来进行指标评价,但我们仍可以通过混淆矩阵来进行处理。可以通过matplotlib的matshow()函数,直观地展示分类结果的好坏。 先使用cross_val_... -
多任务编程的相关概念
2021-07-29 01:11:16对于单核cpu处理多任务,操作系统轮流让各个软件交替执行,假如:软件1执行0.01秒,切换到软件2,软件2执行0.01秒,再切换到软件3,执行0.01秒……这样反复执行下去。表面上看,每个软件都是交替执行的,但是,由于CPU... -
activity多实例任务加签
2020-06-26 17:50:48在一些特殊场景下,需要在某个多实例节点上面动态新增一个审批人员或任务时,就需使用到activity多实例任务加签的功能 加签思路1 根据一级流程实例查找二级流程执行实例 判断二级执行实例是否是多实例任务节点的... -
用于自然语言理解的多任务深度神经网络
2020-07-30 09:59:30本文提出了一个多任务深度神经网络(MT-DNN),用于跨多个自然语言理解(NLU)任务学习表示。MT-DNN不仅利用了大量的跨任务数据,而且还受益于正则化效应,从而产生更通用的表示,以帮助适应新的任务和领域。MT-... -
自然语言处理概述(前沿、数据集、下游任务)
2019-04-26 12:39:20自然语言处理 First at all 因为本人换系统 之前都在用oneNote,在ubuntu上部署不便,所以将一些常用的信息写成博客 本文主要引用Ruder大神的 NLP-proress 做了一下翻译和提取 原文地址:传送门 1.前沿技术 ... -
优化-处理大量定时任务的思路
2019-03-14 11:30:19HashedWheelTimer-高效处理大量定时任务 背景 业务需要,要对app用户做个30s离线的功能,即:用户自登录开始,30s内无操作及下线。 常规思路1(单定时器轮询) 用户登录时用关联数组记录用户的uid &... -
Java - Servlet 3中的异步处理指的是什么?
2019-03-19 17:18:49分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!...答案是肯定的,因为如果一个任务处理时间相当长,那么Servlet或Filter会一直占用着请求处理线程直到任务结束,随... -
多任务操作系统
2019-10-27 12:06:08单用户单任务操作系统是指一台计算机同时只能有一个用户在使用...Windows多任务处理采用的是虚拟机技术,为每一个任务分配短暂的时间片轮流使用CPU。 多任务操作系统在宏观上是并行的,微观上是并发的。 多任务操... -
一个任务分解成多个子任务每个子任务分配一个线程处理(多线程处理一批大数据)
2019-07-17 10:52:251、首先需要理解CountDownLatch: CountDownLatch中count down是倒数的意思,latch则是门闩的含义。整体含义可以理解为倒数的门栓,似乎有一点“三二一,芝麻开门”的感觉。CountDownLatch的作用也是如此,在构造... -
自然语言处理是什么,我们为什么需要处理自然语言?
2019-09-10 19:51:17什么是自然语言处理? 自然语言处理(NLP)是指机器理解并解释人类写作、说话方式的能力。 NLP的目标是让计算机/机器在理解语言上像人类一样智能。最终目标是弥补人类交流(自然语言)和计算机理解(机器语言)之间...
收藏数
1,689,625
精华内容
675,850