接下来本文还要继续分析Heritrix3.1.0系统中的CrawlController类及BdbFrontier类,因为本人觉得前面部分对相关逻辑还没用理清头绪,更重要的原因是由于每篇文章的关注点不同,本人不能在同一篇文章将相关类的所有关注点一一道来

本文要分析的是,Heritrix3.1.0系统是怎样控制采集任务的启动、暂停及停止等相关状态(如果具备状态机的背景知识,也许会更容易理解相关逻辑)

CrawlController对象的状态为枚举类型,共有如下状态

public static enum State {NASCENT, RUNNING, EMPTY, PAUSED, PAUSING, STOPPING, FINISHED, PREPARING }transient private State state = State.NASCENT;

其初始状态为State.NASCENT

(细心的读者会发现,CrawlController对象里面还有另外一个枚举类型CrawlStatus 

/*** Crawl exit status.*/private transient CrawlStatus sExit = CrawlStatus.CREATED;

由于该枚举类型仅用于描述状态,不参与执行逻辑的处理,所以本文对该成员不予深究)

当我们执行采集任务的相关命令时,CrawlController对象的状态同步改变,事件发布方法如下 

/*** 改变状态   发布事件* Send crawl change event to all listeners.* @param newState State change we're to tell listeners' about.* @param message Message on state change.*/protected void sendCrawlStateChangeEvent(State newState, CrawlStatus status) {if(this.state == newState) {// suppress duplicate state-reportsreturn;}this.state = newState; CrawlStateEvent event = new CrawlStateEvent(this,newState,status.getDescription());appCtx.publishEvent(event); }

在上面方法中,除了设置CrawlController对象的状态,同时发布事件,事件类型为CrawlStateEvent(这里的CrawlController对象作为observer模式的subject角色)

CrawlJob类实现了ApplicationListener接口,作为该事件监听者之一(相当于observer模式的observer角色),事件监听方法如下

 /** * 事件监听程序* Log note of all ApplicationEvents.* * @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent)*/public void onApplicationEvent(ApplicationEvent event) {if(event instanceof CrawlStateEvent) {getJobLogger().log(Level.INFO, ((CrawlStateEvent)event).getState() + (ac.getCurrentLaunchId() != null ? " " + ac.getCurrentLaunchId() : ""));}//event.getSource();synchronized (this) {//当正在执行synchronized boolean teardown()方法(里面调用CrawlController对象的void requestCrawlStop()方法)
//并且还没有执行完成时 needTeardown=true
//doTeardown()方法后,needTeardown重置为false,保证方法只执行一次
if (needTeardown && event instanceof StopCompleteEvent) {doTeardown();}}if(event instanceof CheckpointSuccessEvent) {getJobLogger().log(Level.INFO, "CHECKPOINTED "+((CheckpointSuccessEvent)event).getCheckpoint().getName());}}

Heritrix3.1.0系统里面,有多种事件监听者,它们分别监听不同的事件,当相关事件发生时,执行自身的事件处理方法,我们用eclipse开发工具可以看到,有如下事件监听类(实现了ApplicationListener接口)

那么在Heritrix3.1.0系统里面又有哪些可发布的事件类型呢

在Heritrix3.1.0系统里面又有哪些类发布了事件呢

某个问题如果我们穷追不舍的话,总是会越来越多,这里就此打住,有兴趣的读者可以去深究这些事件的来龙去脉(本人预计,事件监听者大多是打印日志功能)

现在回到主题,当我们执行采集任务的 launch命令时(CrawlJob对象的void launch()方法),CrawlController对象的状态开始变为State.PREPARING,再改变为State.PAUSED

State.NASCENT——>State.PREPARING——>State.PAUSED

/** * CrawlJob对象的void launch()方法 launch命令* Operator requested crawl begin*/public void requestCrawlStart() {hasStarted = true; //改变状态为State.PREPARING
        sendCrawlStateChangeEvent(State.PREPARING, CrawlStatus.PREPARING);if(recoveryCheckpoint==null) {// only announce (trigger scheduling of) seeds// when doing a cold (non-recovery) start
            getSeeds().announceSeeds();}setupToePool();// A proper exit will change this value.this.sExit = CrawlStatus.FINISHED_ABNORMAL;if (getPauseAtStart()) {// frontier is already paused unless started, so just // 'complete'/ack pause//改变状态为State.PAUSED
            completePause();} else {getFrontier().run();}}

上面方法中,后面部分的判断为在执行采集任务的 launch命令时,初始状态是否启动BdbFrontier对象的void run()方法(启动采集任务)

当我们执行采集任务的 Unpause命令时,CrawlController对象的状态变为State.RUNNING(预先状态为state== State.PAUSING || state == State.PAUSED)

/*** Unpause命令* Resume crawl from paused state*/public void requestCrawlResume() {if (state != State.PAUSING && state != State.PAUSED) {// Can't resume if not been told to pausereturn;}assert toePool != null;Frontier f = getFrontier();f.unpause();//改变状态
        sendCrawlStateChangeEvent(State.RUNNING, CrawlStatus.RUNNING);}

上面方法中,首先执行BdbFrontier对象的void unpause()方法,然后改变CrawlController对象的状态

当我们执行采集任务的 pause命令时,CrawlController对象的状态变为State.PAUSING(预先状态与上面相反,state != State.PAUSING && state != State.PAUSED)

/*** pause命令* Stop the crawl temporarly.*/public synchronized void requestCrawlPause() {if (state == State.PAUSING || state == State.PAUSED) {// Already about to pausereturn;}sExit = CrawlStatus.WAITING_FOR_PAUSE;getFrontier().pause();//改变状态为State.PAUSINGsendCrawlStateChangeEvent(State.PAUSING, this.sExit);// wait for pause to come via frontier changes}

上面方法中,首先执行BdbFrontier对象的void pause()方法,然后改变CrawlController对象的状态

当我们执行采集任务的terminate命令时,CrawlController对象的状态变为State.STOPPING(预先状态为state != State.STOPPING && state != State.FINISHED)

 /*** terminate命令/teardown命令* Operator requested for crawl to stop.*/public synchronized void requestCrawlStop() {if(state == State.STOPPING) {// second stop request; nudge the threads with interrupts
            getToePool().cleanup();}requestCrawlStop(CrawlStatus.ABORTED);}

进一步调用synchronized void requestCrawlStop(CrawlStatus message)方法

/*** Operator requested for crawl to stop.* @param message */public synchronized void requestCrawlStop(CrawlStatus message) {if (state == State.NASCENT) {this.sExit = message;this.state = State.FINISHED;this.isStopComplete = true;}if (state == State.STOPPING || state == State.FINISHED ) {return;}if (message == null) {throw new IllegalArgumentException("Message cannot be null.");}if(this.sExit != CrawlStatus.FINISHED) {// don't clobber an already-FINISHED with alternate statusthis.sExit = message;}beginCrawlStop();}

进一步调用void beginCrawlStop()方法

/*** Start the process of stopping the crawl. */public void beginCrawlStop() {LOGGER.fine("Started.");//改变状态为State.STOPPINGsendCrawlStateChangeEvent(State.STOPPING, this.sExit);Frontier frontier = getFrontier();if (frontier != null) {frontier.terminate();}LOGGER.fine("Finished."); }

上面方法中,首先改变CrawlController对象的状态,然后执行BdbFrontier对象的void terminate()方法

当我们执行采集任务的teardown命令时,我们先从CrawlJob对象的synchronized boolean teardown()方法开始分析

/*** Ensure a fresh start for any configuration changes or relaunches,* by stopping and discarding an existing ApplicationContext.* * @return true if teardown is complete when method returns, false if still in progress*/public synchronized boolean teardown() {CrawlController cc = getCrawlController();if (cc != null) {cc.requestCrawlStop();needTeardown = true;// wait up to 3 seconds for stopfor(int i = 0; i < 11; i++) {if(cc.isStopComplete()) {break;}try {Thread.sleep(300);} catch (InterruptedException e) {// do nothing
                }}//判断CrawlController cc的成员属性(boolean isStopComplete=true)//设置needTeardown = false//关闭PathSharingContext ac对象if (cc.isStopComplete()) {doTeardown();}}assert needTeardown == (ac != null);return !needTeardown; }

同样首先调用CrawlController对象的synchronized void requestCrawlStop()方法(二次调用会强制中断ToePool toePool中的线程)

/*** terminate命令/teardown命令* Operator requested for crawl to stop.*/public synchronized void requestCrawlStop() {if(state == State.STOPPING) {// second stop request; nudge the threads with interrupts
            getToePool().cleanup();}requestCrawlStop(CrawlStatus.ABORTED);}

我们不能孤立的来分析CrawlController对象的状态,因为在执行命令调用的相关方法里面,都会执行相应的BdbFrontier对象的相关方法,而在BdbFrontier对象里面同时会回调CrawlController对象的方法,从而使CrawlController对象的状态改变

BdbFrontier对象同样也维持自身的状态,这个状态成员同样也是枚举类型,不过跟CrawlController对象的状态成员不是同一个

BdbFrontier对象的状态成员如下(State targetState = State.PAUSE为自身的状态,State lastReachedState = null为最后发送到CrawlController对象的状态记录)

 /** last Frontier.State reached; used to suppress duplicate notifications */State lastReachedState = null;/** Frontier.state that manager thread should seek to reach */volatile State targetState = State.PAUSE;

这里的State成员定义如下(在Frontier接口里面)

/*** Enumeration of possible target states. */public enum State { RUN,  // juggle/prioritize/emit; usual stateEMPTY, // running/ready but no URIs queued/scheduledHOLD, // NOT YET USED enter a consistent, stable, checkpointable state ASAPPAUSE, // enter a stable state where no URIs are in-progress; unlike// HOLD requires all in-process URIs to completeFINISH  // end and cleanup; may not return to any other state after// this state is requested/reached}

当CrawlController对象调用的方法分别如下,调用这些方法同时会改变BdbFrontier对象的状态(State targetState)

public void run() {requestState(State.RUN);}/* (non-Javadoc)* @see org.archive.crawler.framework.Frontier#requestState(org.archive.crawler.framework.Frontier.State)*/public void requestState(State target) {targetState = target;}public void pause() {requestState(State.PAUSE);}public void unpause() {requestState(State.RUN);}public void terminate() {requestState(State.FINISH);}

 在CrawlController对象初始化时,会在一个线程里面调用自身的void managementTasks()方法,该方法不断的根据CrawlController对象状态(State targetState成员属性)来修改ReentrantReadWriteLock outboundLock = new ReentrantReadWriteLock(true)成员的锁定属性,并且调用void reachedState(State justReached)方法(在该方法里面回调CrawlController对象的方法从而使其状态作相应的变化)

/*** Main loop of frontier's managerThread. Only exits when State.FINISH * is requested (perhaps automatically at URI exhaustion) and reached. * * General strategy is to try to fill outbound queue, then process an* item from inbound queue, and repeat. A HOLD (to be implemented) or * PAUSE puts frontier into a stable state that won't be changed* asynchronously by worker thread activity. */protected void managementTasks() {assert Thread.currentThread() == managerThread;try {loop: while (true) {try {State reachedState = null; switch (targetState) {case EMPTY:reachedState = State.EMPTY; case RUN:// enable outbound takes if previously lockedwhile(outboundLock.isWriteLockedByCurrentThread()) {outboundLock.writeLock().unlock();}if(reachedState==null) {reachedState = State.RUN; }reachedState(reachedState);Thread.sleep(1000);if(isEmpty()&&targetState==State.RUN) {requestState(State.EMPTY); } else if (!isEmpty()&&targetState==State.EMPTY) {requestState(State.RUN); }break;case HOLD:// TODO; for now treat same as PAUSEcase PAUSE:// pausing// prevent all outbound takes
                        outboundLock.writeLock().lock();// process all inboundwhile (targetState == State.PAUSE) {if (getInProcessCount()==0) {reachedState(State.PAUSE);}Thread.sleep(1000);}break;case FINISH:// prevent all outbound takes
                        outboundLock.writeLock().lock();// process all inboundwhile (getInProcessCount()>0) {Thread.sleep(1000);}finalTasks(); // TODO: more cleanup?
                        reachedState(State.FINISH);break loop;}} catch (RuntimeException e) {// log, try to pause, continuelogger.log(Level.SEVERE,"",e);if(targetState!=State.PAUSE && targetState!=State.FINISH) {requestState(State.PAUSE);}}}} catch (InterruptedException e) {throw new RuntimeException(e);} // try to leave in safely restartable state: targetState = State.PAUSE;while(outboundLock.isWriteLockedByCurrentThread()) {outboundLock.writeLock().unlock();}//TODO: ensure all other structures are cleanly reset on restart
        logger.log(Level.FINE,"ending frontier mgr thread");}

 void reachedState(State justReached)方法如下,回调CrawlController对象的方法

/*** The given state has been reached; if it is a new state, generate* a notification to the CrawlController. * * TODO: evaluate making this a generic notification others can sign up for*/protected void reachedState(State justReached) {if(justReached != lastReachedState) {controller.noteFrontierState(justReached);lastReachedState = justReached;}}

CrawlController对象的void noteFrontierState(Frontier.State reachedState) 方法(我们可以看到,参数为Frontier.State类型)

/*** Receive notification from the frontier, in the frontier's own * manager thread, that the frontier has reached a new state. * * @param reachedState the state the frontier has reached*/public void noteFrontierState(Frontier.State reachedState) {switch (reachedState) {case RUN: LOGGER.info("Crawl running.");sendCrawlStateChangeEvent(State.RUNNING, CrawlStatus.RUNNING);break;case EMPTY: LOGGER.info("Crawl empty.");if(!getRunWhileEmpty()) {this.sExit = CrawlStatus.FINISHED;beginCrawlStop();}sendCrawlStateChangeEvent(State.EMPTY, CrawlStatus.RUNNING);break; case PAUSE:if (state == State.PAUSING) {completePause();}break;case FINISH:completeStop();break;default:// do nothing
        }}

如果发送过来的状态为Frontier.State.FINISH,则进一步调用void completeStop()方法

/*** Called when the last toethread exits.*/protected void completeStop() {LOGGER.fine("Entered complete stop.");statisticsTracker.getSnapshot(); // ???this.reserveMemory = null;if (this.toePool != null) {this.toePool.cleanup();}this.toePool = null;LOGGER.fine("Finished crawl.");try {appCtx.stop(); } catch (RuntimeException re) {LOGGER.log(Level.SEVERE,re.getMessage(),re);}sendCrawlStateChangeEvent(State.FINISHED, this.sExit);// CrawlJob needs to be sure all beans have received FINISHED signal before teardownthis.isStopComplete = true;appCtx.publishEvent(new StopCompleteEvent(this)); }

该方法里面修改CrawlController对象的状态,中断ToePool toePool中的线程,并且发布StopCompleteEvent事件

这里我们还可以看到this.isStopComplete = true属性的修改,表示在CrawlJob对象在执行doTeardown()方法前保证this.isStopComplete = true

这样我们就不难理解前面的synchronized boolean teardown()方法和事处理件方法void onApplicationEvent(ApplicationEvent event)里面的判断了

doTeardown()方法为同步方法,在synchronized boolean teardown()方法和事件处理方法void onApplicationEvent(ApplicationEvent event)只能同时一个调用该方法 

// ac guaranteed to be null after this method is calledprotected synchronized void doTeardown() {needTeardown = false;try {if (ac != null) { ac.close();}} finally {// all this stuff should happen even in case ac.close() bugs outac = null;xmlOkAt = new DateTime(0);if (currentLaunchJobLogHandler != null) {getJobLogger().removeHandler(currentLaunchJobLogHandler);currentLaunchJobLogHandler.close();currentLaunchJobLogHandler = null;}getJobLogger().log(Level.INFO,"Job instance discarded");}}

在上面方法里面设置同时设置needTeardown = false,则事件处理方法接收到StopCompleteEvent事件时不会再调用该方法

(思考:假如synchronized boolean teardown()方法处于阻塞,如果事件处理方法void onApplicationEvent(ApplicationEvent event)接收到StopCompleteEvent事件先执行doTeardown()方法,synchronized boolean teardown()方法还会不会再次执行该方法) 

--------------------------------------------------------------------------- 

本系列Heritrix 3.1.0 源码解析系本人原创 

转载请注明出处 博客园 刺猬的温驯 

本文链接 http://www.cnblogs.com/chenying99/archive/2013/05/12/3073654.html

转载于:https://www.cnblogs.com/chenying99/archive/2013/05/12/3073654.html

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. es6重难点

    es6重难点总结归纳 2018已经成为过去,2019年最重要的事就是换工作,换工作,换工作!!!得不到的永远在骚动,从去年的一些面试试水来看,各大厂的面试要求那是万变不离其中,进行自我总结了一下,无非就是以下知识点:调用堆栈 作用域闭包 this全面解析 深浅拷贝的原理 原型…...

    2024/4/9 10:44:29
  2. 通过js检测浏览器支持的字体,从而显示支持的字体,让用户选择。

    http://www.zhangxinxu.com/wordpress/2018/02/js-detect-suppot-font-family/ 本文根据张鑫旭文章。 字体函数:var dataFont = {windows: [{ch: 宋体,en: SimSun}, {ch: 黑体,en: SimHei}, {ch: 微软雅黑,en: Microsoft Yahei}, {ch: 微软正黑体,en: Microsoft JhengHei}, {c…...

    2024/4/18 23:58:03
  3. 深度解读运维自动化

    说实话,一个运维团队的运维能力如何,其实看一个自动化管理系统便知! ********文章较长,索引目录如下******* 一、概述 二、运维自动化的三重境界 三、运维自动化的多维解读 ******第一、基于应用变更场景的维度划分 ******第二、基于系统层次的维度划分 ******第三、基于和…...

    2024/4/19 23:32:54
  4. Heritrix 1.14.4 安装/使用

    Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。本文详细介绍了 Heritrix 在 Eclipse 中的配置、运行。目前 Heritrix 的最新版本是 3.1.0(2011-10-21 发布),您可以…...

    2024/4/20 4:40:13
  5. ES6 全套教程 ECMAScript6 笔记

    原文链接: http://jsrun.net/tutorial/cZKKp当前进度:函数的扩展最近在看这篇文档学习ES6。其中有些错误的地方做个更正,以供参考1。变量的解构赋值一节有这样一段let foo; let {foo} = {foo: 1}; // SyntaxError: Duplicate declaration "foo"let baz; let {bar:…...

    2024/4/9 10:44:26
  6. HTML5中 audio标签的样式修改

    由于html5的流行,现在移动端大多数的需求都可以使用audio来播放音频,但您可能只是需要很简单的播放/停止效果,但不同的浏览器上的audio样式却不尽人意,那么要怎么改变这个样式呢,其实它的原理比较简单,就是把写audio的时候不要用controls属性,隐藏原生的audio, 然后用d…...

    2024/4/12 18:06:27
  7. CSS字体:Webfont在线字体与外部字体及操作系统预装字体使用指南

    前言 熟知,从HTML4时代把图标做在一张图上使用css background来提高页面加载速度到“扁平化UI”趋势的到来,再到“手机UI”简洁化设计的大浪潮的席卷下,使用字体库变得更加广泛,各种字体库层出不穷,并且网站拥有一套精美的字体,也是开发关键因素之一,网站风格与字体风格…...

    2024/4/15 14:37:55
  8. ES6新特性整理

    欢迎访问我的博客https://qqqww.com/,祝码农同胞们早日走上人生巅峰,迎娶白富美~~~文章目录1 Babel 转码2 声明变量2.1 let2.1.1 引入 let 的好处2.1.2 let 规则2.2 const3 模板字面量4 解构赋值4.1 数组的解构赋值4.2 对象的解构赋值4.3 字符串的解构赋值4.4 数值和布尔值的…...

    2024/4/13 10:05:36
  9. 网络爬虫系统Heritrix的结构分析

    随着网络时代的日新月异,人们对搜索引擎,网页的内容,大数据处理等问题有了更多的要求。如何从海量的互联网信息中选取最符合要求的信息成为了新的热点。在这种情况下,网络爬虫框架heritrix出现解决了这个问题。Heritrix是一个开源的、java开发的、可扩展的web爬虫项目。用户…...

    2024/4/12 18:06:27
  10. [8]DevOps 自动化运维工具Chef---如何查看Chef 自身的开发的API的文档?

    我们知道Chef是基于Ruby开发的。而Ruby本身提供了ri的方式查看文档。那么什么是ri,ri是一个命令行的工具,让你可以方便的在控制台中查询API。同时ri 也可以启动一个文档服务器。 首先,我们用ri 查看chef的chefdk类。其会显示下面的信息。这种方式是我们已经Chef的类名,然后…...

    2024/4/22 2:43:53
  11. 14款CSS3炫酷表单input输入框美化效果【附源码】

    这是一款效果非常酷的CSS3表单input输入框美化效果插件。为表单的input输入框制作一些特殊的效果能给用户带来更好的用户体验。这个CSS3表单input输入框美化插件就是一个很好的例子。这个插件中的效果大多数是使用CSS transitions来切换伪元素制作的。HTML结构HTML结构使用一个…...

    2024/4/13 10:06:17
  12. 如何“隐藏”运行程序的“命令提示符”界面(C代码)

    (大段搬运的理论,不愿学习的,自行忽略) 0. 拿dios的VS2010写个小程序,要求写好了不需弹出任何窗口,就连闪一下都不行。 尼玛,平时写个Win32 consolo, VS或者WDK编译都是弹出命令提示符执行,打印个结果调试信息什么的。不让了这回。记得有个较好的方法是写个宏定义,把…...

    2024/4/20 21:17:19
  13. html中对应Word中的字体和字号

    网上找了一下,要么是只有字体要么是只有字号。故鄙人都整理了下,附原文链接 ———————————————— 原文链接:https://blog.csdn.net/xuexizhe88/article/details/79277587 原文链接:https://blog.csdn.net/qq_31603575/article/details/80518047windows常见内置…...

    2024/4/12 18:06:37
  14. 前端开发规范手册(命名、HTML、CSS、JS、ES6、React)

    简介 前端开发规范手册(命名、HTML、CSS、JS、ES6、React)完整链接,欢迎给出您的宝贵意见; GitHub源码地址,要是觉得文档还能凑合着看,欢迎 star ~不以规矩,不能成方圆。 对于团队而言,统一很重要,代码是写给人看的,然后顺便跑在机器上而已。有过忧虑吗 你是不是总是…...

    2024/4/17 16:50:40
  15. :运维与自动化运维概括

    运维与自动化运维概括一:运维工作内容分类:个人理解级别从低到高 1).机房运维(负责服务器上下架、IP配置与划分、服务器打标签、机房定期巡检、服务器故障报修、服务器硬件监控) 2).基础设施运维(系统安装初始化、网络维护) 3).监控运维(724运维值班、简单故障处理、通…...

    2024/4/12 18:06:37
  16. Heritrix解决中文乱码

    最近,突发奇想,想把工作中遇到的问题和大家分享出来。自己没有牛到贡献一个开源项目,但是,有多少就贡献多少吧。废话不多说。第一次分享的是Heritrix的乱码解决。根据官方文档或者是一些blog,可以很轻松的配出一个可以运行的heritrix,基于web的管理页面也十分简单。但是中…...

    2024/4/13 7:50:11
  17. Ubuntu下面安装字体后,显示不完全的问题

    比如华康徽宗宫体,安装后,只有一部分字的字体能正常显示, 这个是由于华康徽宗宫体是Big5编码制作的,想要完全显示,必须输入法调整为繁体输出才可以。但是问题来了,系统的一些软件上的字体也显示不正常,一部分是宋体,一部分是华康徽宗宫体(也就是说使用字体后,系统中一…...

    2024/4/28 16:09:11
  18. Heritrix Eclipse配置和使用

    1、首先在 Eclipse 中新建 Java 工程 ,工程名自取,以MyHeritrix为例。利用下载的源代码包根据以下步骤来配置这个工程。2、导入类库 Heritrix 所用到的工具类库都在 heritrix-1.14.4-src\lib 目录下,需要将其导入 MyHeritrix 工程。 1)将 heritrix-1.14.4-src 下的 lib 文…...

    2024/4/28 1:58:14
  19. 引入即可使用的jQuery弹出框美化插件

    [TOC] xcConfirm插件是一个美化版弹框插件,弹框的标题文本可以自定义。引入js和css文件即可直接使用,使用简单。 源码,演示效果引入2个js和一个css,注意还有源码里的图片.<link rel="stylesheet" type="text/css" href="css/xcConfirm.css&qu…...

    2024/4/28 1:51:20
  20. 携程网络防火墙自动化运维

    作者简介:田国华,携程高级网络安全经理,14年网络安全行业工作经验。2010年加入携程网站运营中心,负责携程技术安全体系建设,包括网络安全架构规划设计、安全方案、产品评估及安全系统运维管理工作。 声明:本文为CSDN投稿文章,未经许可,禁止任何形式的转载。 随着互联网…...

    2024/4/28 4:09:47

最新文章

  1. [方法] Unity 实现仿《原神》第三人称跟随相机 v1.0

    参考网址&#xff1a;【Unity中文课堂】RPG战斗系统Plus 在Unity游戏引擎中&#xff0c;实现类似《原神》的第三人称跟随相机并非易事&#xff0c;但幸运的是&#xff0c;Unity为我们提供了强大的工具集&#xff0c;其中Cinemachine插件便是实现这一目标的重要工具。Cinemachi…...

    2024/5/3 14:17:49
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. C# 构建可定时关闭的异步提示弹窗

    C# 构建可定时关闭的异步提示弹窗 引言1、调用接口的实现2、自动定时窗口的实现 引言 我们在最常用最简单的提示弹框莫过于MessageBox.Show( )的方法了&#xff0c;但是使用久了之后&#xff0c;你会发现这个MessageBox并不是万能的&#xff0c;有事后并不想客户去点击&#x…...

    2024/5/2 6:14:07
  4. 产品推荐 | 中科亿海微推出亿迅®A8000金融FPGA加速卡

    01、产品概述 亿迅A8000金融加速卡&#xff0c;是中科亿海微联合金融证券领域的战略合作伙伴北京睿智融科&#xff0c;将可编程逻辑芯片与金融行业深度结合&#xff0c;通过可编程逻辑芯片对交易行情加速解码&#xff0c;实现低至纳秒级的解码引擎&#xff0c;端到端的处理时延…...

    2024/5/2 2:35:23
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57