1 SchedulerFactory

1.1 概述

  • Quartz是以模块的方式构建的,因为,要使它运行,几个组件必须很好的组合在一起。非常幸运的是,已经有了一些现存的助手可以完成这些工作。
  • 所有Scheduler实例都是由SchedulerFactory创建的。
  • Quartz的三个核心概念:调度器(Scheduler)、任务(Job)和触发器(Trigger),三者之间的关系是:

  • 一个作业,比较重要的的三个要素就是Scheduler、JobDetail和Trigger。而Trigger对于Job而言就好比是一个驱动器;没有触发器来定时驱动作业,作业就无法运行;对于Job而言,一个Job可以对应多个Trigger,但是对于Trigger而言,一个Trigger只能对应一个Job;所以一个Trigger只能被指派给一个Job;如果你需要更复杂的触发计划,你可以创建多个Trigger并指派它们给同一个Job。

1.2 Scheduler的创建方式

1.2.1 StdSchedulerFactory

  • Quartz默认使用的是StdSchedulerFactory。
  • 使用一组参数(java.util.Properties)来创建和初始化Quartz调度器。
  • 配置参数一般存储在quartz.properties文件中。
  • 调用getScheduler方法就可以创建和初始化调度器对象。
  1. StdSchedulerFactory fact = new StdSchedulerFactory();
  2. Scheduler scheduler = fact.getScheduler();

1.2.1.1 输出调度器开始的时间:

  1. Date scheduleJob(JobDetail jobDetail, Trigger trigger)
  2. throws SchedulerException;
  • 示例:
  • MailJob.java
  1. package com.sunxiaping;
  2.  
  3. import org.quartz.Job;
  4. import org.quartz.JobExecutionContext;
  5. import org.quartz.JobExecutionException;
  6.  
  7. import java.util.Date;
  8.  
  9. public class MailJob implements Job {
  10.  
  11. public void execute(JobExecutionContext context) throws JobExecutionException {
  12. System.out.println("当前时间是:"+new Date());
  13.  
  14. }
  15. }
  • QuartzTest.java
  1. package com.sunxiaping;
  2.  
  3. import org.quartz.*;
  4. import org.quartz.impl.StdSchedulerFactory;
  5.  
  6. import java.util.Date;
  7.  
  8. /**
  9. * Quartz测试
  10. */
  11. public class QuartzTest {
  12.  
  13. public static void main(String[] args) throws SchedulerException {
  14. Date startDate = new Date();
  15. startDate.setTime(startDate.getTime() + 3000);
  16.  
  17. Date endDate = new Date();
  18. endDate.setTime(endDate.getTime() + 10000);
  19.  
  20. JobDetail jobDetail = JobBuilder.newJob(MailJob.class)
  21. .withIdentity("job1", "group1")
  22. .build();
  23.  
  24. Trigger trigger = TriggerBuilder.newTrigger()
  25. .withIdentity("trigger1", "group1")
  26. .startNow() //立即开始,在Scheduler调度器开启之后
  27. .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
  28. .build();
  29.  
  30. Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  31.  
  32. Date date = scheduler.scheduleJob(jobDetail, trigger);
  33. System.out.println("调度器开始时间:" + date);
  34.  
  35. scheduler.start();
  36.  
  37. }
  38.  
  39. }

1.2.1.2 启动任务调度

  1. void start() throws SchedulerException;

1.2.1.3 任务调度挂起,即暂停

  1. void standby() throws SchedulerException;
  • 示例:
  • MailJob.java
  1. package com.sunxiaping;
  2.  
  3. import org.quartz.Job;
  4. import org.quartz.JobExecutionContext;
  5. import org.quartz.JobExecutionException;
  6.  
  7. import java.util.Date;
  8.  
  9. public class MailJob implements Job {
  10.  
  11. public void execute(JobExecutionContext context) throws JobExecutionException {
  12. System.out.println("当前时间是:"+new Date());
  13.  
  14. }
  15. }
  • QuartzTest.java
  1. package com.sunxiaping;
  2.  
  3. import org.quartz.*;
  4. import org.quartz.impl.StdSchedulerFactory;
  5.  
  6. import java.util.Date;
  7.  
  8. /**
  9. * Quartz测试
  10. */
  11. public class QuartzTest {
  12.  
  13. public static void main(String[] args) throws SchedulerException, InterruptedException {
  14. Date startDate = new Date();
  15. startDate.setTime(startDate.getTime() + 3000);
  16.  
  17. Date endDate = new Date();
  18. endDate.setTime(endDate.getTime() + 10000);
  19.  
  20. JobDetail jobDetail = JobBuilder.newJob(MailJob.class)
  21. .withIdentity("job1", "group1")
  22. .build();
  23.  
  24. Trigger trigger = TriggerBuilder.newTrigger()
  25. .withIdentity("trigger1", "group1")
  26. .startNow() //立即开始,在Scheduler调度器开启之后
  27. .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
  28. .build();
  29.  
  30. Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  31.  
  32. scheduler.scheduleJob(jobDetail, trigger);
  33.  
  34. scheduler.start();
  35.  
  36. //Scheduler执行2秒后自动挂起
  37. Thread.sleep(2000L);
  38. scheduler.standby();
  39.  
  40. //Scheduler执行5秒后自动开启
  41. Thread.sleep(5000L);
  42. scheduler.start();
  43.  
  44. }
  45.  
  46. }

1.2.1.4 关闭任务调度

  1. void shutdown() throws SchedulerException;
  2.  
  3. void shutdown(boolean waitForJobsToComplete)
  4. throws SchedulerException;
  • 如果shutdown中的参数是true:表示等待所有正在执行的Job执行完毕之后,再关闭Scheduler。
  • 如果shutdown中的参数是false:表示直接关闭Scheduler。
  • 示例:
  • MailJob.java
  1. package com.sunxiaping;
  2.  
  3. import org.quartz.Job;
  4. import org.quartz.JobExecutionContext;
  5. import org.quartz.JobExecutionException;
  6.  
  7. import java.util.Date;
  8.  
  9. public class MailJob implements Job {
  10.  
  11. public void execute(JobExecutionContext context) throws JobExecutionException {
  12. System.out.println("当前时间是:"+new Date());
  13.  
  14. }
  15. }
  • QuartzTest.java
  1. package com.sunxiaping;
  2.  
  3. import org.quartz.*;
  4. import org.quartz.impl.StdSchedulerFactory;
  5.  
  6. import java.util.Date;
  7.  
  8. /**
  9. * Quartz测试
  10. */
  11. public class QuartzTest {
  12.  
  13. public static void main(String[] args) throws SchedulerException, InterruptedException {
  14. Date startDate = new Date();
  15. startDate.setTime(startDate.getTime() + 3000);
  16.  
  17. Date endDate = new Date();
  18. endDate.setTime(endDate.getTime() + 10000);
  19.  
  20. JobDetail jobDetail = JobBuilder.newJob(MailJob.class)
  21. .withIdentity("job1", "group1")
  22. .build();
  23.  
  24. Trigger trigger = TriggerBuilder.newTrigger()
  25. .withIdentity("trigger1", "group1")
  26. .startNow() //立即开始,在Scheduler调度器开启之后
  27. .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
  28. .build();
  29.  
  30. Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  31.  
  32. scheduler.scheduleJob(jobDetail, trigger);
  33.  
  34. scheduler.start();
  35.  
  36. Thread.sleep(2000L);
  37. scheduler.shutdown(true);
  38.  
  39. }
  40.  
  41. }

1.2.2 DirectSchedulerFactory(了解)

  • DirectSchedulerFactory是对SchedulerFactory的直接实现,通过它可以直接构建Scheduler、ThreadPool等。
  1. DirectSchedulerFactory directSchedulerFactory = DirectSchedulerFactory.getInstance();
  2. Scheduler scheduler = directSchedulerFactory.getScheduler();

2 Quartz.properties

  • 默认路径是:quartzjar包中org.quartz中的quartz.properties。
  1. # Default Properties file for use by StdSchedulerFactory
  2. # to create a Quartz Scheduler Instance, if a different
  3. # properties file is not explicitly specified.
  4. #
  5.  
  6. org.quartz.scheduler.instanceName: DefaultQuartzScheduler
  7. org.quartz.scheduler.rmi.export: false
  8. org.quartz.scheduler.rmi.proxy: false
  9. org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
  10.  
  11. org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
  12. org.quartz.threadPool.threadCount: 10
  13. org.quartz.threadPool.threadPriority: 5
  14. org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
  15.  
  16. org.quartz.jobStore.misfireThreshold: 60000
  17.  
  18. org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

  • 我们也可以自己新建一个quartz.properties文件覆盖掉原来的quartz.properties文件。
  • 调度器属性:
  • org.quartz.scheduler.instanceName属性用来区分特定的调度器实例,可以按照功能用途来给调度器命名。
  • org.quartz.scheduler.instanceId属性和前者一样,也允许任何字符串,但是这个值必须在所有调度器实例中是唯一的,尤其是一个集群环境中,作为集群中的唯一key。如果你想Quartz帮你生成这个值的话,可以设置为AUTO。
  • 线程池属性:
  • org.quartz.threadPool.threadCount:处理Job的线程个数,至少为1,但是最多的话不要超过100,在多数机器上设置该值超过100的话就会显得相当不实用了,特别是在你的Job执行时间较长的情况下。
  • org.quartz.threadPool.threadPriority:线程的优先级,优先级级别高的线程比优先级级别低的线程优先得到执行。最小为1,最大为10,默认为5。
  • org.quartz.threadPool.class:一个实现了org.quartz.spi.ThreadPool接口的类,Quartz自带的线程池的实现类是org.quartz.simpl.SimpleThreadPool。
  • 作业存储设置:
  • 描述了调度器实例的生命周期中,Job和Trigger信息是如何存储的。
  • 插件配置:
  • 满足特定需求用到的Quartz插件的配置。

3 Quartz监听器

3.1 概述

  • Quartz的监听器用于当任务调度中你所关注的事件发生的时候,能够及时获取这一事件的通知。
  • 类似于任务执行过程中的邮件、短信类的提醒。
  • Quartz的监听器主要有TriggerListener、JobListener、SchedulerListener三种,顾名思义,分别表示任务、触发器、调度器对应的监听器。
  • 三者的使用方法类似,在开始介绍三种监听器之前,需要明确两个概念:全局监听器和非全局监听器,二者的区别在于:全局监听器能够接收到所有的Job/Trigger的事件通知,而非全局监听器只能接收到在其上注册的Job或Trigger的事件。

3.2 JobListener

  • 任务调度的过程中,和任务Job相关的事件包括:Job开始要执行的提示。Job执行完成的提示。
  1. package org.quartz;
  2.  
  3. public interface JobListener {
  4.  
  5. String getName();
  6.  
  7. void jobToBeExecuted(JobExecutionContext context);
  8.  
  9. void jobExecutionVetoed(JobExecutionContext context);
  10.  
  11. void jobWasExecuted(JobExecutionContext context,
  12. JobExecutionException jobException);
  13.  
  14. }
  • 其中:
  • getName方法:用于获取该JobListener的名称。
  • jobToBeExecuted方法:Scheduler在JobDetail将要被执行的时候调用这个方法。
  • jobExecutionVetoed方法:Scheduler在JobDetail即将被执行,但又被TriggerListener否决时会调用该方法。
  • jobWasExecuted方法:Scheduler在JobDetail被执行之后调用此方法。
  • 示例:全局JobListener
  • MailJob.java
  1. package com.sunxiaping;
  2.  
  3. import org.quartz.Job;
  4. import org.quartz.JobExecutionContext;
  5. import org.quartz.JobExecutionException;
  6.  
  7. import java.util.Date;
  8.  
  9. public class MailJob implements Job {
  10.  
  11. public void execute(JobExecutionContext context) throws JobExecutionException {
  12. System.out.println(this.getClass().getName() + "当前时间是:" + new Date());
  13. }
  14. }
  • MyJobListener.java
  1. package com.sunxiaping;
  2.  
  3. import org.quartz.JobExecutionContext;
  4. import org.quartz.JobExecutionException;
  5. import org.quartz.JobListener;
  6.  
  7. public class MyJobListener implements JobListener {
  8. @Override
  9. public String getName() {
  10. System.out.println("监听器的名称:" + this.getClass().getName());
  11. return getClass().getName();
  12. }
  13.  
  14. @Override
  15. public void jobToBeExecuted(JobExecutionContext context) {
  16. System.out.println("Scheduler在JobDetail将要被执行的时候调用这个方法");
  17. }
  18.  
  19. @Override
  20. public void jobExecutionVetoed(JobExecutionContext context) {
  21. System.out.println("Scheduler在JobDetail即将被执行,但又被TriggerListener否决时会调用该方法");
  22. }
  23.  
  24. @Override
  25. public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
  26. System.out.println("Scheduler在JobDetail被执行之后调用此方法");
  27. }
  28. }
  • QuartzTest.java
  1. package com.sunxiaping;
  2.  
  3. import org.quartz.*;
  4. import org.quartz.impl.StdSchedulerFactory;
  5. import org.quartz.impl.matchers.EverythingMatcher;
  6.  
  7. /**
  8. * Quartz测试
  9. */
  10. public class QuartzTest {
  11.  
  12. public static void main(String[] args) throws SchedulerException, InterruptedException {
  13. JobDetail jobDetail = JobBuilder.newJob(MailJob.class)
  14. .withIdentity("job1", "group1")
  15. .build();
  16.  
  17. Trigger trigger = TriggerBuilder.newTrigger()
  18. .withIdentity("trigger1", "group1")
  19. .startNow() //立即开始,在Scheduler调度器开启之后
  20. .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
  21. .build();
  22.  
  23. Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  24.  
  25. scheduler.scheduleJob(jobDetail, trigger);
  26.  
  27. //创建并创建一个全局的Job Listener
  28. scheduler.getListenerManager().addJobListener(new MyJobListener(), EverythingMatcher.allJobs());
  29.  
  30. scheduler.start();
  31.  
  32. }
  33.  
  34. }
  • 示例:局部Listener
  • MailJob.java
  1. package com.sunxiaping;
  2.  
  3. import org.quartz.Job;
  4. import org.quartz.JobExecutionContext;
  5. import org.quartz.JobExecutionException;
  6.  
  7. import java.util.Date;
  8.  
  9. public class MailJob implements Job {
  10.  
  11. public void execute(JobExecutionContext context) throws JobExecutionException {
  12. System.out.println(this.getClass().getName() + "当前时间是:" + new Date());
  13. }
  14. }
  • MyJobListener.java
  1. package com.sunxiaping;
  2.  
  3. import org.quartz.JobExecutionContext;
  4. import org.quartz.JobExecutionException;
  5. import org.quartz.JobListener;
  6.  
  7. public class MyJobListener implements JobListener {
  8. @Override
  9. public String getName() {
  10. System.out.println("监听器的名称:" + this.getClass().getName());
  11. return getClass().getName();
  12. }
  13.  
  14. @Override
  15. public void jobToBeExecuted(JobExecutionContext context) {
  16. System.out.println("Scheduler在JobDetail将要被执行的时候调用这个方法");
  17. }
  18.  
  19. @Override
  20. public void jobExecutionVetoed(JobExecutionContext context) {
  21. System.out.println("Scheduler在JobDetail即将被执行,但又被TriggerListener否决时会调用该方法");
  22. }
  23.  
  24. @Override
  25. public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
  26. System.out.println("Scheduler在JobDetail被执行之后调用此方法");
  27. }
  28. }
  • QuartzTest.java
  1. package com.sunxiaping;
  2.  
  3. import org.quartz.*;
  4. import org.quartz.impl.StdSchedulerFactory;
  5. import org.quartz.impl.matchers.KeyMatcher;
  6.  
  7. /**
  8. * Quartz测试
  9. */
  10. public class QuartzTest {
  11.  
  12. public static void main(String[] args) throws SchedulerException, InterruptedException {
  13. JobDetail jobDetail = JobBuilder.newJob(MailJob.class)
  14. .withIdentity("job1", "group1")
  15. .build();
  16.  
  17. Trigger trigger = TriggerBuilder.newTrigger()
  18. .withIdentity("trigger1", "group1")
  19. .startNow() //立即开始,在Scheduler调度器开启之后
  20. .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
  21. .build();
  22.  
  23. Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  24.  
  25. scheduler.scheduleJob(jobDetail, trigger);
  26.  
  27. //创建并创建一个局部的Job Listener
  28. scheduler.getListenerManager().addJobListener(new MyJobListener(), KeyMatcher.keyEquals(JobKey.jobKey("job1","group1")));
  29.  
  30. scheduler.start();
  31.  
  32. }
  33.  
  34. }

3.3 TriggerListener

  • 任务调度过程中,和触发器Trigger相关的事件包括:触发器触发、触发器没有正常触发、触发器完成。
  1. package org.quartz;
  2.  
  3. import org.quartz.Trigger.CompletedExecutionInstruction;
  4.  
  5. public interface TriggerListener {
  6.  
  7. String getName();
  8.  
  9. void triggerFired(Trigger trigger, JobExecutionContext context);
  10.  
  11. boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);
  12.  
  13. void triggerMisfired(Trigger trigger);
  14.  
  15. void triggerComplete(Trigger trigger, JobExecutionContext context,
  16. CompletedExecutionInstruction triggerInstructionCode);
  17.  
  18. }
  • 其中:
  • getName方法:用于获取触发器的名称。
  • TriggerFired方法:当和触发器相关联的Trigger被触发,Job上的execute()方法将被执行的时候,Scheduler就调用该方法。
  • vetoJobExecution方法:在Trigger触发后,Job将要被执行的时候由Scheduler调用这个方法。TriggerListener给了一个选择去否决Job的执行。假如这个方法返回true,这个Job将不会为此Trigger触发而得到执行。
  • triggerMisfired方法:Scheduler调用这个方法是在Trigger错过触发的时候。
  • triggerComplete方法:Trigger被触发并且完成了Job的执行的时候,Scheduler就调用了该方法。
  • 示例:
  • 略。

3.4 SchedulerListener

  • SchedulerListener会在Scheduler的生命周期中关键事件发生时被调用。和Scheduler有关的事件包括增加/删除一个job/trigger,scheduler发生严重错误,关闭scheduler等。
  1. package org.quartz;
  2.  
  3. public interface SchedulerListener {
  4.  
  5. void jobScheduled(Trigger trigger);
  6.  
  7. void jobUnscheduled(TriggerKey triggerKey);
  8.  
  9. void triggerFinalized(Trigger trigger);
  10.  
  11. void triggerPaused(TriggerKey triggerKey);
  12.  
  13. void triggersPaused(String triggerGroup);
  14.  
  15. void triggerResumed(TriggerKey triggerKey);
  16.  
  17. void triggersResumed(String triggerGroup);
  18.  
  19. void jobAdded(JobDetail jobDetail);
  20.  
  21. void jobDeleted(JobKey jobKey);
  22.  
  23. void jobPaused(JobKey jobKey);
  24.  
  25. void jobsPaused(String jobGroup);
  26.  
  27. void jobResumed(JobKey jobKey);
  28.  
  29. void jobsResumed(String jobGroup);
  30.  
  31. void schedulerError(String msg, SchedulerException cause);
  32.  
  33. void schedulerInStandbyMode();
  34.  
  35. void schedulerStarted();
  36.  
  37. void schedulerStarting();
  38.  
  39. void schedulerShutdown();
  40.  
  41. void schedulerShuttingdown();
  42.  
  43. void schedulingDataCleared();
  44. }
  • 其中:
  • jobScheduled方法:用于部署JobDetail时被调用。
  • jobUnscheduled方法:用于卸载JobDetail时被调用。
  • triggerFinalized方法:当一个Trigger来到了再也不会触发的状态时调用这个方法。除非这个Job已经设置成了持久性,否则它就会从Scheduler中移除。
  • triggersPaused方法:Scheduler调用这个方法是发生在一个Trigger或Trigger组被暂停时。假如是Trigger组的话,triggerName参数将为null。
  • triggersResumed方法:Scheduler调用这个方法是发生成一个Trigger或Trigger组从暂停中恢复时。假如是Trigger组的话,triggerName的参数将为null。
  • jobsPaused方法:当一个或一组JobDetail暂停时调用这个方法。
  • jobsResumed方法:当一个或一组Job从暂停上恢复时调用这个方法。
  • schedulerError方法:在Scheduler的正常运行期间产生一个严重错误的时候调用这个方法。
  • schedulerStarted方法:在Scheduler开启的时候,调用该方法。
  • schedulerStandbyMode方法:当Scheduler处于StandBy模式,调用该方法。
  • schedulerShutdown方法:当Scheduler停止的时候,调用该方法。
  • schedulingDataCleared方法:当Scheduler的数据被清除的时候,调用该方法。
  • 示例:
  • 略。

Quartz(二)的更多相关文章

  1. 开源定时任务框架Quartz(二)

    概述 上一篇文章完成了第一个Quartz程序的编写,这篇从Quartz中的几个重要对象来更深一层认识Quartz框架. Job和JobDetail Job是Quartz中的一个接口,接口下只有exec ...

  2. Quartz (二) 和Spring整合

    先给个场景:每五分钟扫描并关闭7天未付款的订单 1.quartz pom.xml依赖 <dependencies> <dependency> <groupId>or ...

  3. quartz (二) Spring+Quartz实现定时任务的配置方法

    JobDetail  设置执行的任务 :CronTrigger   触发器:设置执行的时间规则      ;  Scheduler    // 调度器,将任务与执行时间关联 本文转自:http://w ...

  4. quartz.net 使用(一)-执行定时计划任务

    一.使用nuget安装所需要的包 Install-Package Quartz 二.实现自己的job继承IJob public class FirstJob : IJob { public void ...

  5. ASP.NET quartz 定时任务

    1.下载 2.使用例子 Demo 概述:Quartz 是开源的定时任务工具类,默认每隔10秒执行一次任务,相当于C#的Timer,不断的循环执行(Start 方法),也可以随时停止(ShutDown方 ...

  6. windows服务autofac注入quartz任务

    一.nuget下载相关类库引用 install-package Quartz install-package Autofac install-package Autofac.Configuration ...

  7. Spring(十)Spring任务调度

    一.计划任务 需要定时执行一些计划(定时更新等),这样的计划称之为计划任务 Spring抽象封装了Java提供的Timer与TimerTask类 也可以使用拥有更多任务计划功能的Quartz 二.Ti ...

  8. 最全spring boot视频系列,你值得拥有

    ================================== 从零开始学Spring Boot视频 ================================== àSpringBoot ...

  9. 1.spring boot起步之Hello World【从零开始学Spring Boot】

    [视频&交流平台] àSpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008&utm ...

  10. 0. 前言【从零开始学Spring Boot】

    [视频&交流平台] àSpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008&utm ...

随机推荐

  1. Git 提交 .gitignore文件

    问题描述 不知道小伙伴有木有遇到这种情况:想在工程里增加 .gitignore 文件,用于在以后提交后,过滤哪些文件或者目录. 但是,在当前工程的根目录下,执行如下执行命令后,依然不能把 .gitig ...

  2. mysql linux环境

    创建新用户 create user jnroot@'%' identified by 'Yc@edc#sJn';创建数据库 create database price_monitor DEFAULT ...

  3. python 连接 hive数据库环境搭建

    首先需要安装以下Python 包:(我用的是Python 2) 在安装Python包之前需要安装一些依赖工具: Debian/Ubuntu: apt-get install python-dev li ...

  4. python学习之模块-模块(一)

    第五章 5.1 自定义模块 模块概念: ​ 把一些常用的函数放在一个py文件中,这个文件就称之为模块. 模块的意义: ​ 1.方便管理.让程序的解构更加清晰,实现功能的重复使用: ​ 2.提升开发效率 ...

  5. Docker面试题(二)

    什么是虚拟化? 虚拟化允许您在相同的硬件上运行两个完全不同的操作系统.每个客户操作系统都经历了引导,加载内核等所有过程.您可以拥有非常严格的安全性,例如,客户操作系统无法完全访问主机操作系统或其他客户 ...

  6. mysql——多表——子查询——示例

    子查询: 子查询是将一个查询语句嵌套在另外一个查询语句中,内层查询语句的查询结果,可以作为外来层查询语句提供查询条件. 因此在特定条件下,一个查询语句的条件,需要另外一个查询语句来获取. 前期准备表: ...

  7. 另一种分页器 不依赖Paginator模块的方法

    """ 分页组件 """ class Pagination(object): def __init__(self, current_page ...

  8. <<C++ Primer>> 第 5 章 语句

    术语表 第 5 章 语句 块(block): 包围在花括号内的由 0 条或多条语句组成的序列.块也是一条语句,所以只要是能使用语句的地方,就可以使用块.    break语句(break statem ...

  9. hdu3829 二分匹配 最大独立集

    Cat VS Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others) Problem ...

  10. ubuntu 安装 Anaconda2和3的tips

    Anaconda 2 3 安装tips 安装anaconda2 我们要下载Anaconda2-4.3.0-Linux-x86_64.sh安装文件 下载好之后,在文件路径下执行以下命令: bash An ...