异步

  虽然 JS 是异步执行的语言,但是人的思维是同步的————因此,开发者总是在寻求如何使用逻辑上看似同步的代码来完成 JS 的异步请求。目前,开发人员已经给出了解决异步的成熟可行的方案,那就是Promise,并进一步提出了基于Promise的async函数。

Promise

  Promise可以实现其他语言中类似Future和Deferred一样的功能,它既可以像事件和回调函数一样指定稍后执行的代码,也可以明确指示代码是否成功执行。基于这些成功或失败的状态,决定代码是否继续执行。为了让代码更容易理解和调试,支持链式地编写Promise。

Promise的生命周期
  每个Promise都会经历一个短暂的生命周期:先是处于进行中(pending)的状态,此时操作尚未完成,所以它也是未处理(unsettled)的;一旦异步操作执行结束,Promise则变为已处理(settled)的状态,fulfilled标志Promise异步操作成功完成,rejected标志由于程序错误或一些其他原因,Promise异步操作未能成功。
  内部属性[[PromiseState]]被用来表示Promise的3种状态:pending、fulfilled及rejected。这个属性不暴露在Promise对象上,所以不能以编程的方式检测Promise的状态,当Promise的状态改变时,then()方法会采取特定的行动。

then

  所有Promise都有then()方法,它接受两个参数:
  第一个是当Promise的状态变为fulfilled时要调用的函数,与异步操作相关的附加数据都会传递给这个完成函数。
  第二个是当Promise的状态变为rejected时要调用的函数,其与完成时调用的函数类似,所有与失败状态相关的附加数据都会传递给这个拒绝函数。
  then()的两个参数都是可选的,所以可以按照任意组合的方式来监听Promise,执行完成或被拒绝都会被响应。

let promise = readFile("example.txt");
promise.then(function(contents) {  // 同时监听了执行完成和执行被拒;
    // 完成
    console.log(contents);
}, function(err) {
    // 拒绝
    console.error(err.message);
});
promise.then(function(contents) { // 只监听了执行完成,错误时不报告
    // 完成
    console.log(contents);
});
promise.then(null, function(err) { // 只监听了执行被拒,成功时不报告
    // 拒绝
    console.error(err.message);
});

  如果一个对象实现了上述的then()方法,那这个对象我们称之为thenable对象。所有的Promise都是thenable对象,但并非所有thenable对象都是Promise。

  Promise还有一个catch()方法,相当于只给其传入拒绝处理程序的then()方法。

promise.catch(function(err) {
    // 拒绝
    console.error(err.message);
});
// 等同于:
promise.then(null, function(err) {
    // 拒绝
    console.error(err.message);
});

  如果一个Promise处于己处理状态,在这之后添加到任务队列中的处理程序仍将执行。所以无论何时都可以添加新的完成处理程序或拒绝处理程序,同时也可以保证这些处理程序能被调用。

let promise = readFile("example.txt");
    // 原始的完成处理函数
    promise.then(function(contents) {
        console.log(contents);
        // 现在添加另一个
        promise.then(function(contents) {
            console.log(contents);
        });
});
创建未处理的Promise

  用Promise构造函数可以创建新的Promise,构造函数只接受一个参数:包含初始化Promise代码的执行器(executor)函数。执行器接受两个参数,分别是resolve()函数和reject()函数。执行器成功完成时调用resolve()函数,反之,失败时则调用reject()函数。

// Node.js 范例
let fs = require("fs");
function readFile(filename) {
    return new Promise(function(resolve, reject) {
        // 触发异步操作
        fs.readFile(filename, { encoding: "utf8" }, function(err, contents) {
            // 检查错误
            if (err) {
                reject(err);
                return;
            }
            // 读取成功
            resolve(contents);
        });
    });
}
let promise = readFile("example.txt");
// 同时监听完成与拒绝
promise.then(function(contents) {
    // 完成
    console.log(contents);
}, function(err) {
    // 拒绝
    console.error(err.message);
});

  readFile()方法被调用时执行器会立刻执行,在执行器中,无论是调用resolve()还是reject(),都会向任务队列中添加一个任务来解决这个Promise。

let promise = new Promise(function(resolve, reject) {
    console.log("Promise");
    resolve();
});
console.log("Hi!");

  这段代码的输出内容是

promise
Hi !

  调用resolve()后会触发一个异步操作,传入then()和catch()方法的函数会被添加到任务队列中并异步执行。

let promise = new Promise(function(resolve, reject) {
    console.log("Promise");
    resolve();
});
promise.then(function() {
    console.log("Resolved.");
});
console.log("Hi!");

  这个示例的输出内容为

promise
Hi !
Resolved

  即使在代码中then()调用位于console.log("Hi!")之前,但其与执行器不同,它并没有立即执行。这是因为,完成处理程序和拒绝处理程序总是在执行器完成后被添加到任务队列的末尾。

创建已处理的Promise

  创建未处理Promise的最好方法是使用Promise的构造函数,这是由于Promise执行器具有动态性。但如果想用Promise来表示一个已知值,则编排一个只是简单地给resolve()函数传值的任务并无实际意义,反倒是可以用以下两种方法根据特定的值来创建己解决Promise。
  Promise.resolve()方法只接受一个参数并返回一个完成态的Promise,也就是说不会有任务编排的过程,而且需要向Promise添加一至多个完成处理程序来获取值。

let promise = Promise.resolve(42);
promise.then(function(value) {
    console.log(value); // 42
});

  同理也可以通过Promise.reject()方法来创建已拒绝态的Promise,它与Promise.resolve()很像,唯一的区别是创建出来的是拒绝态的Promise。

非Promise的Thenable对象

  Promise.resolve()方法和Promise.reject()方法都可以接受非Promise的Thenable对象作为参数。如果传入一个非Promise的Thenable对象,则这些方法会创建一个新的Promise,并在then()函数中被调用。

let thenable = {
    then: function(resolve, reject) {
        resolve(42);
    }
};
let p1 = Promise.resolve(thenable);
p1.then(function(value) {
    console.log(value); // 42
});

  在此示例中,Promise.resolve()调用的是thenable.then(),所以Promise的状态可以被检测到。由于是在then()方法内部调用了resolve(42),因此thenable对象的Promise状态是已完成。新创建的已完成状态Promise p1从thenable对象接受传入的值(也就是42),p1的完成处理程序将42赋值给形参value。

执行器错误

  如果执行器内部抛出一个错误,则Promise的拒绝处理程序就会被调用。

let promise = new Promise(function(resolve, reject) {
    throw new Error("Explosion!");
});
promise.catch(function(error) {
    console.log(error.message); // "Explosion!"
});
串联

  每次调用then()方法或catch()方法时实际上创建并返回了另一个Promise,只有当第一个Promise完成或被拒绝后,第二个才会被解决。

let p1 = new Promise(function(resolve, reject) {
    resolve(42);
});
p1.then(function(value) {
    console.log(value);
}).then(function() {
    console.log("Finished");
});

  这段代码输出以下内容:

42
Finished
捕获错误

  在之前的示例中,完成处理程序或拒绝处理程序中可能发生错误,而Promise链可以用来捕获这些错误。

let p1 = new Promise(function(resolve, reject) {
    throw new Error("Explosion!");
});
p1.catch(function(error) {
    console.log(error.message); // "Explosion!"
    throw new Error("Boom!");
}).catch(function(error) {
    console.log(error.message); // "Boom!"
});

  链式Promise调用可以感知到链中其他Promise的错误。

Promise链的返回值

  Promise链的另一个重要特性是可以给下游Promise传递数据,已经知道了从执行器resolve()处理程序到Promise完成处理程序的数据传递过程,如果在完成处理程序中指定一个返回值,则可以沿着这条链继续传递数据。

let p1 = new Promise(function(resolve, reject) {
    resolve(42);
});
p1.then(function(value) {
    console.log(value); // "42"
    return value + 1;
}).then(function(value) {
    console.log(value); // "43"
});

  在拒绝处理程序中也可以做相同的事情,当它被调用时可以返回一个值,然后用这个值完成链条中后续的Promise。

let p1 = new Promise(function(resolve, reject) {
    reject(42);
});
p1.catch(function(value) {
    // 第一个完成处理函数
    console.log(value); // "42"
    return value + 1;
}).then(function(value) {
    // 第二个完成处理函数
    console.log(value); // "43"
});
在Promise链中返回Promise

  在Promise间可以通过完成和拒绝处理程序中返回的原始值来传递数据,但如果返回的是Promise对象,会通过一个额外的步骤来确定下一步怎么走。

let p1 = new Promise(function(resolve, reject) {
    resolve(42);
});
let p2 = new Promise(function(resolve, reject) {
    resolve(43);
});
p1.then(function(value) {
    // 第一个完成处理函数
    console.log(value); // 42
    return p2;
}).then(function(value) {
    // 第二个完成处理函数
    console.log(value); // 43
});
let p1 = new Promise(function(resolve, reject) {
    resolve(42);
});
let p2 = new Promise(function(resolve, reject) {
    reject(43);
});
p1.then(function(value) {
    // 第一个完成处理函数
    console.log(value); // 42
    return p2;
}).catch(function(value) {
    // 拒绝处理函数
    console.log(value); // 43
});
Promise.all()

  在Promise.all()方法只接受一个参数并返回一个Promise,该参数是一个含有多个受监视Promise的可迭代对象(如一个数组),只有当可迭代对象中所有Promise都被解决后返回的Promise才会被解决,只有当可迭代对象中所有Promise都被完成后返回的Promise才会被完成。

let p1 = new Promise(function(resolve, reject) {
    resolve(42);
});
let p2 = new Promise(function(resolve, reject) {
    resolve(43);
});
let p3 = new Promise(function(resolve, reject) {
    resolve(44);
});
let p4 = Promise.all([p1, p2, p3]);
p4.then(function(value) {
    console.log(Array.isArray(value)); // true
    console.log(value[0]); // 42
    console.log(value[1]); // 43
    console.log(value[2]); // 44
});

  所有传入Promise.all()方法的Promise只要有一个被拒绝,那么返回的Promise没等所有Promise都完成就立即被拒绝。

Promise.race()

  Promise.race()方法监听多个Promise的方法稍有不同:它也接受含多个受监视Promise的可迭代对象作为唯一参数并返回一个Promise,但只要有一个Promise被解决返回的Promise就被解决,无须等到所有Promise都被完成。一旦数组中的某个Promise被完成,Promise.race()方法也会像Promise.all()方法一样返回一个特定的Promise。

let p1 = Promise.resolve(42);
let p2 = new Promise(function(resolve, reject) {
    resolve(43);
});
let p3 = new Promise(function(resolve, reject) {
    resolve(44);
});
let p4 = Promise.race([p1, p2, p3]);
p4.then(function(value) {
    console.log(value); // 42
});
Generator

  在 ES6 出现之前,基本都是各式各样类似Promise的解决方案来处理异步操作的代码逻辑,ES6 的Generator却给异步操作又提供了新的思路,马上就有人给出了如何用Generator来更加优雅的处理异步操作,但Generator函数的执行必须靠执行器,要配合co模块使用,而ES2017给出了另一个更优雅的解决方案async函数。
  async 函数是 Generator 函数的语法糖,该函数自带执行器,拥有更好的语义、更广的适用性。async函数的await命令后面,可以是Promise 对象和原始类型的值(数值、字符串和布尔值),async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。
  总之,在解决JS异步的问题上,相比于async,Generato显得既笨拙又复杂,本文将不再讨论Generator的使用。

async函数

  async函数返回一个 Promise 对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。

function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value);
}

asyncPrint('hello world', 50);

  上面代码指定50毫秒以后,输出hello world。

async 函数有多种使用形式

// 函数声明
async function foo() {}

// 函数表达式
const foo = async function () {};

// 对象的方法
let obj = { async foo() {} };
obj.foo().then(...)

// Class 的方法
class Storage {
  constructor() {
    this.cachePromise = caches.open('avatars');
  }

  async getAvatar(name) {
    const cache = await this.cachePromise;
    return cache.match(`/avatars/${name}.jpg`);
  }
}

const storage = new Storage();
storage.getAvatar('jake').then(…);

// 箭头函数
const foo = async () => {};

语法
  async函数返回一个 Promise 对象,async函数内部return语句返回的值,会成为then方法回调函数的参数。

async function f() {
  return 'hello world';
}

f().then(v => console.log(v))
// "hello world"
async function f() {
  throw new Error('出错了');
}

f().then(
  v => console.log(v),
  e => console.log(e)
)
// Error: 出错了

Promise 对象的状态变化
  async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。

async function getTitle(url) {
  let response = await fetch(url);
  let html = await response.text();
  return html.match(/([\s\S]+)<\/title>/i)[1];
}
getTitle('https://tc39.github.io/ecma262/').then(console.log)
// "ECMAScript 2018 Language Specification"
</code></pre> 
 <p>  上面代码中,函数getTitle内部有三个操作:抓取网页、取出文本、匹配页面标题。只有这三个操作全部完成,才会执行then方法里面的console.log。</p> 
 <p><strong>await命令</strong><br>   正常情况下,await命令后面是一个 Promise 对象。如果不是,会被转成一个立即resolve的 Promise 对象。</p> 
 <pre><code>async function f() {
  return await 123;
}

f().then(v => console.log(v)) // 123
</code></pre> 
 <pre><code>async function f() {
  await Promise.reject('出错了');
}

f()
.then(v => console.log(v))
.catch(e => console.log(e))// 出错了
</code></pre> 
 <p>  只要一个await语句后面的 Promise 变为reject,那么整个async函数都会中断执行。</p> 
 <pre><code>async function f() {
  await Promise.reject('出错了');
  await Promise.resolve('hello world'); // 不会执行
}
</code></pre> 
 <p>  有时,希望即使前一个异步操作失败,也不要中断后面的异步操作。这时可以将第一个await放在try...catch结构里面,这样不管这个异步操作是否成功,第二个await都会执行。</p> 
 <pre><code>async function myFunction() {
  try {
    await somethingThatReturnsAPromise();
  } catch (err) {
    console.log(err);
  }
}

// 另一种写法

async function myFunction() {
  await somethingThatReturnsAPromise()
  .catch(function (err) {
    console.log(err);
  });
}
</code></pre> 
</article>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1183763277306503168"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(异步)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1950232820773351424.htm"
                           title="移动端城市区县二级联动选择功能实现包" target="_blank">移动端城市区县二级联动选择功能实现包</a>
                        <span class="text-muted">good2know</span>

                        <div>本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery</div>
                    </li>
                    <li><a href="/article/1950141157006700544.htm"
                           title="【Spring WebFlux】为什么 Spring 要拥抱响应式" target="_blank">【Spring WebFlux】为什么 Spring 要拥抱响应式</a>
                        <span class="text-muted">会飞的架狗师</span>
<a class="tag" taget="_blank" href="/search/Spring/1.htm">Spring</a><a class="tag" taget="_blank" href="/search/WebFlux/1.htm">WebFlux</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>在现代分布式系统中,响应式系统已成为应对高并发、低延迟需求的核心方案。但构建响应式系统并非易事——它需要框架级别的支持来解决异步处理、资源调度、背压控制等底层问题。作为Java生态中最具影响力的框架,Spring对响应式的支持并非偶然,而是技术演进的必然选择。本文将从响应式系统的构建挑战出发,剖析Spring拥抱响应式的底层逻辑。一、响应式系统的构建困境:现有方案的局限性响应式系统的核心诉求是在有</div>
                    </li>
                    <li><a href="/article/1950141029860569088.htm"
                           title="使用Spring Boot构建响应式应用" target="_blank">使用Spring Boot构建响应式应用</a>
                        <span class="text-muted">微赚淘客系统@聚娃科技</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>使用SpringBoot构建响应式应用大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何利用SpringBoot构建响应式应用,以适应现代应用程序对高并发和低延迟的需求。一、什么是响应式应用?响应式应用是一种通过异步编程模型来处理并发请求和数据流的应用程序设计方式。它能够更有效地利用计算资源,提供更快的响应时间和更高</div>
                    </li>
                    <li><a href="/article/1950103100488478720.htm"
                           title="GCD如何多个异步任务,最后返回的时候同步执行" target="_blank">GCD如何多个异步任务,最后返回的时候同步执行</a>
                        <span class="text-muted">Adam_潜</span>

                        <div>用信号量+group算是进阶应用https://www.jianshu.com/p/24ffa819379c</div>
                    </li>
                    <li><a href="/article/1950055310613868544.htm"
                           title="Vue3组合API初体验" target="_blank">Vue3组合API初体验</a>
                        <span class="text-muted">DTcode7</span>
<a class="tag" taget="_blank" href="/search/Vue%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97/1.htm">Vue实战指南</a><a class="tag" taget="_blank" href="/search/VUE/1.htm">VUE</a><a class="tag" taget="_blank" href="/search/HTML/1.htm">HTML</a><a class="tag" taget="_blank" href="/search/web/1.htm">web</a><a class="tag" taget="_blank" href="/search/vue%E6%A1%86%E6%9E%B6/1.htm">vue框架</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>Vue3组合API初体验基本概念与作用说明示例一:使用ref创建响应式数据示例二:使用reactive创建响应式对象示例三:使用computed计算属性示例四:使用watch监听数据变化示例五:使用provide/inject进行父子组件间通信功能使用思路与实际开发技巧1.何时使用ref与reactive?2.如何在组合式API中保持逻辑的清晰?3.如何处理异步操作?随着Vue3的发布,组合式AP</div>
                    </li>
                    <li><a href="/article/1950051525124485120.htm"
                           title="OpenSIPS 邂逅 Kafka:构建高效 VoIP 消息处理架构" target="_blank">OpenSIPS 邂逅 Kafka:构建高效 VoIP 消息处理架构</a>
                        <span class="text-muted">c_zyer</span>
<a class="tag" taget="_blank" href="/search/opensips/1.htm">opensips</a><a class="tag" taget="_blank" href="/search/SIP/1.htm">SIP</a><a class="tag" taget="_blank" href="/search/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/1.htm">消息队列</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/opensips/1.htm">opensips</a><a class="tag" taget="_blank" href="/search/voip/1.htm">voip</a>
                        <div>使用场景使用步骤引入模块组装&发送数据消费数据故障转移使用场景异步日志处理:将OpenSIPS中的SIP信令日志、通话记录(CDR)等数据发送到Kafka队列中。事件通知与监控:利用OpenSIPS的event_interface模块将SIP事件(如呼叫建立、断开、注册等)推送到KafkaOpenSIPS中事件接口有以下类型:EVENT_DATAGRAM-PublishJSON-RPCnotifi</div>
                    </li>
                    <li><a href="/article/1950040812469415936.htm"
                           title="25年不倒的“犀牛书“:为什么《JavaScript权威指南第7版》仍是程序员的案头圣经?" target="_blank">25年不倒的“犀牛书“:为什么《JavaScript权威指南第7版》仍是程序员的案头圣经?</a>
                        <span class="text-muted">阿蒙Armon</span>
<a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a>
                        <div>25年不倒的"犀牛书":为什么《JavaScript权威指南第7版》仍是程序员的案头圣经?当一本技术书能连续畅销25年,历经7次迭代仍稳坐领域第一梯队,它必然藏着超越时代的硬实力。《JavaScript权威指南(原书第7版)》就是这样一部传奇——豆瓣9.4分的封神之作,程序员口中的"犀牛书",从网景时代到ES2020,它始终是JavaScript开发者的终极参考书。如果你还在为原型链、闭包、异步编</div>
                    </li>
                    <li><a href="/article/1950000459624280064.htm"
                           title="electron中IPC 渲染进程与主进程通信方法解析" target="_blank">electron中IPC 渲染进程与主进程通信方法解析</a>
                        <span class="text-muted">雅痞yuppie</span>
<a class="tag" taget="_blank" href="/search/electron%E6%A1%8C%E9%9D%A2%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91/1.htm">electron桌面应用开发</a><a class="tag" taget="_blank" href="/search/electron/1.htm">electron</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>electron中ipcRenderer.invoke、ipcRenderer.on、ipcRenderer.send、ipcRenderer.sendSync作用与区别IPC渲染进程与主进程通信方法解析ipcRenderer的这几个方法作用不完全相同,它们适用于不同的通信场景,核心区别在于通信方向、是否需要响应以及同步/异步特性。下面详细说明:1.ipcRenderer.send(channel</div>
                    </li>
                    <li><a href="/article/1949984193702326272.htm"
                           title="Python 4.0新特性解析:性能优化与语法升级" target="_blank">Python 4.0新特性解析:性能优化与语法升级</a>
                        <span class="text-muted">知识产权13937636601</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA/1.htm">计算机</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>本文针对Python4.0的核心升级展开系统性分析,从性能优化与语法革新两个维度揭示其技术突破。首先解析新型解释器架构对运算效率的提升路径,其次探讨模式匹配、异步编程简化和类型系统强化等语法特性,最后结合机器学习与高并发场景验证新版本的实践价值。研究发现,Python4.0通过JIT编译器与内存管理重构实现3倍以上性能跃升,同时静态类型推导的完善显著提升大型项目维护效率,标志着Python从"胶水</div>
                    </li>
                    <li><a href="/article/1949902988386562048.htm"
                           title="Python 使用期物处理并发(显示下载进度并处理错误)" target="_blank">Python 使用期物处理并发(显示下载进度并处理错误)</a>
                        <span class="text-muted"></span>

                        <div>显示下载进度并处理错误前面说过,17.1节中的几个脚本没有处理错误,这样做是为了便于阅读和比较三种方案(依序、多线程和异步)的结构。为了处理各种错误,我创建了flags2系列示例。flags2_common.py这个模块中包含所有flags2示例通用的函数和设置,例如main函数,负责解析命令行参数、计时和报告结果。这个脚本中的代码其实是提供支持的,与本章的话题没有直接关系,因此我把源码放在附录A</div>
                    </li>
                    <li><a href="/article/1949892890675179520.htm"
                           title="Python爬虫实战入门:手把手教你抓取豆瓣电影TOP250" target="_blank">Python爬虫实战入门:手把手教你抓取豆瓣电影TOP250</a>
                        <span class="text-muted">xiaobindeshijie7</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%85%B6%E4%BB%96/1.htm">其他</a>
                        <div>文章目录一、环境准备(5分钟搞定)二、第一个爬虫实战(超简单版)2.1基础版代码2.2代码解剖(新人必看)三、突破反爬机制(实战精华)3.1伪装大法3.2请求频率控制3.3代理IP使用四、数据存储(多种姿势)4.1CSV存储4.2MySQL存储五、进阶技巧(高手必备)5.1异步爬虫5.2Selenium动态渲染六、法律与伦理(超级重要!!!)七、下一步学习路线一、环境准备(5分钟搞定)工欲善其事必</div>
                    </li>
                    <li><a href="/article/1949885954445602816.htm"
                           title="在 Spring Boot 中优化长轮询(Long Polling)连接频繁建立销毁问题" target="_blank">在 Spring Boot 中优化长轮询(Long Polling)连接频繁建立销毁问题</a>
                        <span class="text-muted">超级小忍</span>
<a class="tag" taget="_blank" href="/search/SpringBoot/1.htm">SpringBoot</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>一、前言长轮询(LongPolling)是一种经典的HTTP轮询机制,它在不支持WebSocket或Server-SentEvents(SSE)的环境中,仍然是一种实现“伪实时”通信的有效方式。然而,长轮询的一个显著缺点是:每次请求都需要建立和销毁连接,频繁的HTTP请求会造成服务器资源的浪费。本文将结合SpringBoot,从异步处理、连接复用、客户端优化等角度出发,详细讲解如何优化长轮询机制,</div>
                    </li>
                    <li><a href="/article/1949874987150143488.htm"
                           title="SpringBoot 实现异步事件Event" target="_blank">SpringBoot 实现异步事件Event</a>
                        <span class="text-muted">木棉软糖</span>
<a class="tag" taget="_blank" href="/search/%E5%85%B6%E4%BB%96%E5%8D%9A%E5%AE%A2%E7%9A%84%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/1.htm">其他博客的阅读笔记</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>文章目录为什么需要用到`SpringEvent`?SpringEvent的使用注解方式实现小结SpringEvent异步模式事件使用建议参考为什么需要用到SpringEvent?我简单说一个场景,大家都能明白:你在公司内部,写好了一个用户注册的功能然后产品经理根据公司情况,新增以下需求注册新用户,给新用户发邮件发放新用户优惠券publicvoidregisterUser(AddUserReques</div>
                    </li>
                    <li><a href="/article/1949860983329583104.htm"
                           title="从手写 Promise 到 Event Loop:前端异步面试题全解读" target="_blank">从手写 Promise 到 Event Loop:前端异步面试题全解读</a>
                        <span class="text-muted"></span>

                        <div>你真的搞懂了JS的异步吗?面试官一个“nextTick和微任务的区别”,别说新手,连三年经验的工程师也常答不上来。开场:异步机制,就是面试里的“送命题”你是不是也有过这样的经历:“你能手写一个Promise吗?”“你知道async/await背后是怎么工作的?”“setTimeout(fn,0)一定最先执行吗?”听起来是基础题,但很多人答得云里雾里。异步是JS的灵魂,但也因为它涉及事件循环、任务队</div>
                    </li>
                    <li><a href="/article/1949854299437723648.htm"
                           title="SpringBoot线程池与事务的终极指南:异步任务也能保证数据一致" target="_blank">SpringBoot线程池与事务的终极指南:异步任务也能保证数据一致</a>
                        <span class="text-muted">幼稚园的山代王</span>
<a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>前言项目中遇到一个需求,需要同时修改最多约10万条数据,而且还不支持批量或异步修改操作。于是只能写个for循环操作,但操作耗时太长,只能一步一步寻找其他解决方案。具体操作如下:一、循环操作的代码先写一个最简单的for循环代码,看看耗时情况怎么样。/****一条一条依次对100000条数据进行更新操作*耗时:2m27s,1m54s*/@TestvoidupdateStudent(){ListallS</div>
                    </li>
                    <li><a href="/article/1949854170920054784.htm"
                           title="Promise详解、自定义" target="_blank">Promise详解、自定义</a>
                        <span class="text-muted">XYR121212</span>
<a class="tag" taget="_blank" href="/search/promise/1.htm">promise</a>
                        <div>这里写目录标题一、.Promise对象详解1.Promise是什么2.Promise的优点3.异步编程4.then(onFulfilled,onRejected):5.util.promisify方法:6.promise的状态改变7.Promise对象的值8.Promise的基本执行流程9.Promise的API10.Promise中的关键问题二、Promise的自定义封装1.定义执行器函数2.通</div>
                    </li>
                    <li><a href="/article/1949849626160984064.htm"
                           title="深度解析 I/O:BIO、NIO、AIO 大揭秘" target="_blank">深度解析 I/O:BIO、NIO、AIO 大揭秘</a>
                        <span class="text-muted"></span>

                        <div>目录一、概念1.1I/O工作本质1.2BIO&NIO&AIO二、BIO&NIO&AIO工作模式2.1BIO(BlockingIO阻塞式I/O)2.2NIO(Non-blockingIO或NewIO非阻塞式I/O)2.3AIO(AsynchronousIO,也叫NIO.2异步I/O)三、应用模式3.1AIO(异步+回调)3.1.1为什么AIO"天生场景窄"(尤其Java)?3.2BIO(阻塞)3.2</div>
                    </li>
                    <li><a href="/article/1949848618047434752.htm"
                           title="000-Python网络库requests教程目录" target="_blank">000-Python网络库requests教程目录</a>
                        <span class="text-muted">lvjesus</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python-requests/1.htm">python-requests</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>Python网络库requests教程目录教程概述本教程将带你从零开始掌握Python最流行的HTTP库requests,从基础的HTTP请求到高级的性能优化,从简单的API调用到复杂的企业级应用开发。通过系统性的学习和丰富的实战案例,帮助你成为requests库的专家。学习路径基础篇进阶篇高级篇实战篇专家篇环境搭建基本请求响应处理会话管理认证机制文件操作SSL处理性能优化异步处理API测试数据采</div>
                    </li>
                    <li><a href="/article/1949806018640801792.htm"
                           title="RocketMQ常见问题梳理" target="_blank">RocketMQ常见问题梳理</a>
                        <span class="text-muted">kk在加油</span>
<a class="tag" taget="_blank" href="/search/rocketmq/1.htm">rocketmq</a>
                        <div>MQ常见问题深度剖析:消息不丢失、顺序性、幂等性与积压处理本文基于RocketMQ核心原理,结合Kafka/RabbitMQ对比,深入分析MQ四大核心问题解决方案一、消息不丢失保障机制消息丢失风险点跨网络传输:生产者→Broker、Broker→消费者、主从同步Broker缓存机制:PageCache异步刷盘导致数据未持久化极端故障:整个MQ集群宕机生产者保证方案1.发送确认机制//RocketM</div>
                    </li>
                    <li><a href="/article/1949742669706096640.htm"
                           title="[Flask] 异步非阻塞IO实现" target="_blank">[Flask] 异步非阻塞IO实现</a>
                        <span class="text-muted">_小老虎_</span>

                        <div>Flask默认是不支持非阻塞IO的,表现为:当请求1未完成之前,请求2是需要等待处理状态,效率非常低。在flask中非阻塞实现可以由2种:启用flask多线程机制#FlaskfromflaskimportFlask,request,gimportosimportsysreload(sys)sys.setdefaultencoding('utf-8')app=Flask(__name__)app.c</div>
                    </li>
                    <li><a href="/article/1949735665474269184.htm"
                           title="【前端】JavaScript 的事件循环 (Event Loop)" target="_blank">【前端】JavaScript 的事件循环 (Event Loop)</a>
                        <span class="text-muted">不懂可否</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>JavaScript的事件循环(EventLoop)是其实现异步编程的核心机制,即使JS是单线程语言,它也能高效处理I/O、网络请求、计时器等非阻塞操作。以下是其工作原理的精要解析:核心概念单线程执行JS引擎(如V8)只能顺序执行一个任务。异步行为需要靠宿主环境(浏览器/Node.js)提供的事件循环调度。任务队列(TaskQueue)所有异步操作完成后对应的回调函数会进入队列等待执行。队列类型包</div>
                    </li>
                    <li><a href="/article/1949669085805604864.htm"
                           title="Flask Tornado 简单对比" target="_blank">Flask Tornado 简单对比</a>
                        <span class="text-muted"></span>

                        <div>Tornado的使用和Flask相差不远,但是,对于Tornado的最大的特点——异步却是其他框架所不能及的,本文就以个人的见解出发,对比一下两款Python的流行框架:Flask和Tornado。对于一个Web框架来说,我觉得有几个方面是需要注意的,分别是:路由请求和响应方式session和cookie模板扩展性下面我就以这些方面为切入点对比一下这两款框架:Flask==0.11.1,Torna</div>
                    </li>
                    <li><a href="/article/1949627613576228864.htm"
                           title="vue3报错:this.$refs.** undefined" target="_blank">vue3报错:this.$refs.** undefined</a>
                        <span class="text-muted">Linux Huang</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>背景:异步加载数据回填到this.$refs.**中,浏览器报错找不到this.$refs.**。进过阅读资料,提到是组件未初始化,意思是页面没加载出来前,this.$refs是无法使用的。解决:先加载页面比如我的对话框是用变量open控制,那么在调用this.$refs.**前,设置代码this.open=true,让对话框加载。然后再对this.$refs.historyTable赋值,解决改</div>
                    </li>
                    <li><a href="/article/1949618407762620416.htm"
                           title="Swift 5, TypeScript, and Python Async/Await 机制对比分析" target="_blank">Swift 5, TypeScript, and Python Async/Await 机制对比分析</a>
                        <span class="text-muted">步子哥</span>
<a class="tag" taget="_blank" href="/search/swift/1.htm">swift</a><a class="tag" taget="_blank" href="/search/typescript/1.htm">typescript</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>Swift5、TypeScript和Python的async/await机制都旨在简化异步编程,但它们在实现细节、并发模型和性能特征上有所不同。Swift5的async/await构建于结构化并发之上,强调通过Task进行非阻塞的任务挂起和高效的线程利用。TypeScript(JavaScript)的async/await是基于Promise和事件循环的语法糖,适用于单线程非阻塞I/O环境。Pyt</div>
                    </li>
                    <li><a href="/article/1949560914550255616.htm"
                           title="异步核战争:Channels实现100万并发秒杀Redis" target="_blank">异步核战争:Channels实现100万并发秒杀Redis</a>
                        <span class="text-muted">ChaITSimpleLove</span>
<a class="tag" taget="_blank" href="/search/.NET/1.htm">.NET</a><a class="tag" taget="_blank" href="/search/%E8%B7%A8%E5%B9%B3%E5%8F%B0/1.htm">跨平台</a><a class="tag" taget="_blank" href="/search/%E9%AB%98%E5%B9%B6%E5%8F%91%E8%AF%B7%E6%B1%82/1.htm">高并发请求</a><a class="tag" taget="_blank" href="/search/.NET/1.htm">.NET</a><a class="tag" taget="_blank" href="/search/Channels/1.htm">Channels</a><a class="tag" taget="_blank" href="/search/%E9%AB%98%E6%80%A7%E8%83%BD/1.htm">高性能</a><a class="tag" taget="_blank" href="/search/%E5%BC%82%E6%AD%A5/1.htm">异步</a><a class="tag" taget="_blank" href="/search/%E6%89%B9%E5%A4%84%E7%90%86/1.htm">批处理</a><a class="tag" taget="_blank" href="/search/%E7%94%9F%E4%BA%A7%E8%80%85%2F%E6%B6%88%E8%B4%B9%E8%80%85/1.htm">生产者/消费者</a><a class="tag" taget="_blank" href="/search/Redis%E8%BF%9E%E6%8E%A5%E8%B5%84%E6%BA%90%E6%B1%A0%E5%8C%96/1.htm">Redis连接资源池化</a>
                        <div>在高并发场景下,传统同步编程模型容易成为性能瓶颈。我来分享如何用.NET的Channel构建异步数据流管道,实现百万级并发处理——这是我们在电商秒杀系统中获得的实战经验:一、传统方案的性能瓶颈测试场景:模拟100万并发请求查询商品库存同步Redis调用:吞吐量1.2万QPS,响应延迟80ms+异步Redis调用:吞吐量3.5万QPS,响应延迟50ms+瓶颈原因:线程池耗尽(默认1000线程)同步I</div>
                    </li>
                    <li><a href="/article/1949549940132868096.htm"
                           title="ECMAScript 2025 (ES16) 核心新特性(8项)" target="_blank">ECMAScript 2025 (ES16) 核心新特性(8项)</a>
                        <span class="text-muted">Web - Anonymous</span>
<a class="tag" taget="_blank" href="/search/ES6/1.htm">ES6</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>ECMAScript2025(ES16)于2025年6月正式发布,并引入了8项核心新特性,显著地提升了JavaScript的开发效率和表达能力。在此列举其关键特性解析及浏览器支持情况。目录一、异步与错误处理1、Promise.try()二、数据结构增强2、Set集合方法3、同步迭代器辅助方法三、模块与数据处理4、JSON模块导入5、延迟模块加载(deferimport)四、正则表达式增强6、Reg</div>
                    </li>
                    <li><a href="/article/1949544871199043584.htm"
                           title="购物车的实现" target="_blank">购物车的实现</a>
                        <span class="text-muted">royluck</span>

                        <div>小程序购物车的商品添加,到最终商品的结算页面,数据的保存,可通过本地存储来保存选择的商品信息。==>商品详情页:数据的存储:分为同步和异步原生的数组本地存储,需要先将数组转化为对象(JSON.stringify()),再存储,而小程序不用!!!参考网址wx.setStorage({key:"shopCarInfo",data:shopCarInfo})注:购物车商品最好储存在服务器,不要存在本地s</div>
                    </li>
                    <li><a href="/article/1949525230741417984.htm"
                           title="HTML5 新特性:MutationObserver 详解" target="_blank">HTML5 新特性:MutationObserver 详解</a>
                        <span class="text-muted">索西引擎</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>一、概念与背景MutationObserver是HTML5引入的一个强大的JavaScriptAPI,它用于异步观察DOM树的变化。在MutationObserver出现之前,开发者若要监测DOM变化,常采用轮询(如使用setInterval不断检查DOM状态)或依赖DOM事件(如DOMNodeInserted、DOMNodeRemoved等)的方式。但轮询效率低下,频繁检查会消耗大量资源;而旧的</div>
                    </li>
                    <li><a href="/article/1949524221927419904.htm"
                           title="unity中的 Coroutine(协程)" target="_blank">unity中的 Coroutine(协程)</a>
                        <span class="text-muted"></span>

                        <div>在Unity中,Coroutine(协程)是一种用于执行异步任务的机制,它允许你在多个帧之间分阶段执行代码,而不阻塞主线程。这在需要执行长时间操作时非常有用,比如延迟执行、等待动画结束或执行异步任务等。1.Coroutine的基本概念通常情况下,Unity的代码在每一帧中执行,直到完成为止。但是,有些任务可能需要跨越多个帧执行,例如:等待一段时间后执行某个操作。在加载数据时执行其他操作。每隔一段时</div>
                    </li>
                    <li><a href="/article/1949465706034688000.htm"
                           title="centos7 安装rabbitMQ3.7.15" target="_blank">centos7 安装rabbitMQ3.7.15</a>
                        <span class="text-muted"></span>

                        <div>RabbitMQ是一个开源的消息代理软件,主要用于在不同的应用程序之间进行异步通信。‌它遵循AMQP协议,提供了稳定可靠的消息传输服务,具有可靠性、灵活性、可扩展性和多语言支持等特点,因此在分布式系统、微服务架构等场景中得到了广泛应用。‌RabbitMQ的核心概念包括队列、交换机、路由键、绑定、生产者和消费者。队列用于存储和转发消息,交换机用于实现消息路由,生产者将消息发送到队列,消费者从队列中取</div>
                    </li>
                                <li><a href="/article/108.htm"
                                       title="Nginx负载均衡" target="_blank">Nginx负载均衡</a>
                                    <span class="text-muted">510888780</span>
<a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a>
                                    <div>Nginx负载均衡一些基础知识: 
 
nginx 的 upstream目前支持 4 种方式的分配 
1)、轮询(默认) 
      每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
2)、weight 
      指定轮询几率,weight和访问比率成正比</div>
                                </li>
                                <li><a href="/article/235.htm"
                                       title="RedHat 6.4 安装 rabbitmq" target="_blank">RedHat 6.4 安装 rabbitmq</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a><a class="tag" taget="_blank" href="/search/rabbitmq/1.htm">rabbitmq</a><a class="tag" taget="_blank" href="/search/redhat/1.htm">redhat</a>
                                    <div>在 linux 下安装软件就是折腾,首先是测试机不能上外网要找运维开通,开通后发现测试机的 yum 不能使用于是又要配置 yum 源,最后安装 rabbitmq 时也尝试了两种方法最后才安装成功 
 
机器版本: 
 
[root@redhat1 rabbitmq]# lsb_release
LSB Version:    :base-4.0-amd64:base-4.0-noarch:core</div>
                                </li>
                                <li><a href="/article/362.htm"
                                       title="FilenameUtils工具类" target="_blank">FilenameUtils工具类</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/FilenameUtils/1.htm">FilenameUtils</a><a class="tag" taget="_blank" href="/search/common-io/1.htm">common-io</a>
                                    <div>转载请出自出处:http://eksliang.iteye.com/blog/2217081 一、概述 
这是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的类FilenameUtils跟FileUtils,其中FilenameUtils是对文件名操作的封装;FileUtils是文件封装,开发中对文件的操作,几乎都可以在这个框架里面找到。 非常的好用。 </div>
                                </li>
                                <li><a href="/article/489.htm"
                                       title="xml文件解析SAX" target="_blank">xml文件解析SAX</a>
                                    <span class="text-muted">不懂事的小屁孩</span>
<a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a>
                                    <div>xml文件解析:xml文件解析有四种方式, 
1.DOM生成和解析XML文档(SAX是基于事件流的解析) 
2.SAX生成和解析XML文档(基于XML文档树结构的解析) 
3.DOM4J生成和解析XML文档 
4.JDOM生成和解析XML  
本文章用第一种方法进行解析,使用android常用的DefaultHandler 
 
 
import org.xml.sax.Attributes;
</div>
                                </li>
                                <li><a href="/article/616.htm"
                                       title="通过定时任务执行mysql的定期删除和新建分区,此处是按日分区" target="_blank">通过定时任务执行mysql的定期删除和新建分区,此处是按日分区</a>
                                    <span class="text-muted">酷的飞上天空</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                    <div>使用python脚本作为命令脚本,linux的定时任务来每天定时执行 
  
#!/usr/bin/python
# -*- coding: utf8 -*-
import pymysql
import datetime
import calendar

#要分区的表
table_name = 'my_table'
#连接数据库的信息
host,user,passwd,db = </div>
                                </li>
                                <li><a href="/article/743.htm"
                                       title="如何搭建数据湖架构?听听专家的意见" target="_blank">如何搭建数据湖架构?听听专家的意见</a>
                                    <span class="text-muted">蓝儿唯美</span>
<a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a>
                                    <div>Edo Interactive在几年前遇到一个大问题:公司使用交易数据来帮助零售商和餐馆进行个性化促销,但其数据仓库没有足够时间去处理所有的信用卡和借记卡交易数据 
 “我们要花费27小时来处理每日的数据量,”Edo主管基础设施和信息系统的高级副总裁Tim Garnto说道:“所以在2013年,我们放弃了现有的基于PostgreSQL的关系型数据库系统,使用了Hadoop集群作为公司的数</div>
                                </li>
                                <li><a href="/article/870.htm"
                                       title="spring学习——控制反转与依赖注入" target="_blank">spring学习——控制反转与依赖注入</a>
                                    <span class="text-muted">a-john</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>       控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。 
  
</div>
                                </li>
                                <li><a href="/article/997.htm"
                                       title="用spool+unixshell生成文本文件的方法" target="_blank">用spool+unixshell生成文本文件的方法</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/xshell/1.htm">xshell</a>
                                    <div>例如我们把scott.dept表生成文本文件的语句写成dept.sql,内容如下:  
  set pages 50000; 
  set lines 200; 
  set trims on; 
  set heading off; 
  spool /oracle_backup/log/test/dept.lst; 
  select deptno||','||dname||','||loc </div>
                                </li>
                                <li><a href="/article/1124.htm"
                                       title="1、基础--名词解析(OOA/OOD/OOP)" target="_blank">1、基础--名词解析(OOA/OOD/OOP)</a>
                                    <span class="text-muted">asia007</span>
<a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/1.htm">学习基础知识</a>
                                    <div>OOA:Object-Oriented Analysis(面向对象分析方法) 
是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。 
  OOA(面向对象的分析)模型由5个层次(主题层、对象类层、结构层、属性层和服务层)</div>
                                </li>
                                <li><a href="/article/1251.htm"
                                       title="浅谈java转成json编码格式技术" target="_blank">浅谈java转成json编码格式技术</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/json%E7%BC%96%E7%A0%81/1.htm">json编码</a><a class="tag" taget="_blank" href="/search/java%E8%BD%AC%E6%88%90json%E7%BC%96%E7%A0%81/1.htm">java转成json编码</a>
                                    <div>json编码;是一个轻量级的数据存储和传输的语言 
   
   在java中需要引入json相关的包,引包方式在工程的lib下就可以了 
  
JSON与JAVA数据的转换(JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非 
  
常适合于服务器与 JavaScript 之间的数据的交</div>
                                </li>
                                <li><a href="/article/1378.htm"
                                       title="web.xml之Spring配置(基于Spring+Struts+Ibatis)" target="_blank">web.xml之Spring配置(基于Spring+Struts+Ibatis)</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/web.xml/1.htm">web.xml</a><a class="tag" taget="_blank" href="/search/SSI/1.htm">SSI</a><a class="tag" taget="_blank" href="/search/spring%E9%85%8D%E7%BD%AE/1.htm">spring配置</a>
                                    <div>指定Spring配置文件位置 
<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/spring-dao-bean.xml,/WEB-INF/spring-resources.xml,
			/WEB-INF/</div>
                                </li>
                                <li><a href="/article/1505.htm"
                                       title="Installing SonarQube(Fail to download libraries from server)" target="_blank">Installing SonarQube(Fail to download libraries from server)</a>
                                    <span class="text-muted">sunjing</span>
<a class="tag" taget="_blank" href="/search/Install/1.htm">Install</a><a class="tag" taget="_blank" href="/search/Sonar/1.htm">Sonar</a>
                                    <div>1.  Download and unzip the SonarQube distribution  
2.  Starting the Web Server 
The default port is "9000" and the context path is "/". These values can be changed in &l</div>
                                </li>
                                <li><a href="/article/1632.htm"
                                       title="【MongoDB学习笔记十一】Mongo副本集基本的增删查" target="_blank">【MongoDB学习笔记十一】Mongo副本集基本的增删查</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a>
                                    <div>一、创建复本集 
  
假设mongod,mongo已经配置在系统路径变量上,启动三个命令行窗口,分别执行如下命令: 
  
mongod --port 27017 --dbpath  data1 --replSet rs0

mongod --port 27018 --dbpath  data2 --replSet rs0

mongod --port 27019 -</div>
                                </li>
                                <li><a href="/article/1759.htm"
                                       title="Anychart图表系列二之执行Flash和HTML5渲染" target="_blank">Anychart图表系列二之执行Flash和HTML5渲染</a>
                                    <span class="text-muted">白糖_</span>
<a class="tag" taget="_blank" href="/search/Flash/1.htm">Flash</a>
                                    <div>今天介绍Anychart的Flash和HTML5渲染功能 
  
 
 HTML5 
 
Anychart从6.0第一个版本起,已经逐渐开始支持各种图的HTML5渲染效果了,也就是说即使你没有安装Flash插件,只要浏览器支持HTML5,也能看到Anychart的图形(不过这些是需要做一些配置的)。 
这里要提醒下大家,Anychart6.0版本对HTML5的支持还不算很成熟,目前还处于</div>
                                </li>
                                <li><a href="/article/1886.htm"
                                       title="Laravel版本更新异常4.2.8-> 4.2.9 Declaration of ... CompilerEngine ... should be compa" target="_blank">Laravel版本更新异常4.2.8-> 4.2.9 Declaration of ... CompilerEngine ... should be compa</a>
                                    <span class="text-muted">bozch</span>
<a class="tag" taget="_blank" href="/search/laravel/1.htm">laravel</a>
                                    <div>昨天在为了把laravel升级到最新的版本,突然之间就出现了如下错误: 
ErrorException thrown with message "Declaration of Illuminate\View\Engines\CompilerEngine::handleViewException() should be compatible with Illuminate\View\Eng</div>
                                </li>
                                <li><a href="/article/2013.htm"
                                       title="编程之美-NIM游戏分析-石头总数为奇数时如何保证先动手者必胜" target="_blank">编程之美-NIM游戏分析-石头总数为奇数时如何保证先动手者必胜</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a>
                                    <div>


import java.util.Arrays;
import java.util.Random;

public class Nim {

	/**编程之美 NIM游戏分析
问题:
有N块石头和两个玩家A和B,玩家A先将石头随机分成若干堆,然后按照BABA...的顺序不断轮流取石头,
能将剩下的石头一次取光的玩家获胜,每次取石头时,每个玩家只能从若干堆石头中任选一堆,</div>
                                </li>
                                <li><a href="/article/2140.htm"
                                       title="lunce创建索引及简单查询" target="_blank">lunce创建索引及简单查询</a>
                                    <span class="text-muted">chengxuyuancsdn</span>
<a class="tag" taget="_blank" href="/search/%E6%9F%A5%E8%AF%A2/1.htm">查询</a><a class="tag" taget="_blank" href="/search/%E5%88%9B%E5%BB%BA%E7%B4%A2%E5%BC%95/1.htm">创建索引</a><a class="tag" taget="_blank" href="/search/lunce/1.htm">lunce</a>
                                    <div>import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Docume</div>
                                </li>
                                <li><a href="/article/2267.htm"
                                       title="[IT与投资]坚持独立自主的研究核心技术" target="_blank">[IT与投资]坚持独立自主的研究核心技术</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/it/1.htm">it</a>
                                    <div> 
 
       和别人合作开发某项产品....如果互相之间的技术水平不同,那么这种合作很难进行,一般都会成为强者控制弱者的方法和手段..... 
 
 
       所以弱者,在遇到技术难题的时候,最好不要一开始就去寻求强者的帮助,因为在我们这颗星球上,生物都有一种控制其</div>
                                </li>
                                <li><a href="/article/2394.htm"
                                       title="flashback transaction闪回事务查询" target="_blank">flashback transaction闪回事务查询</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E9%97%AA%E5%9B%9E%E4%BA%8B%E5%8A%A1/1.htm">闪回事务</a>
                                    <div>   
闪回事务查询有别于闪回查询的特点有以下3个: 
 
(1)其正常工作不但需要利用撤销数据,还需要事先启用最小补充日志。 
 
(2)返回的结果不是以前的“旧”数据,而是能够将当前数据修改为以前的样子的撤销SQL(Undo SQL)语句。 
 
(3)集中地在名为flashback_transaction_query表上查询,而不是在各个表上通过“as of”或“vers</div>
                                </li>
                                <li><a href="/article/2521.htm"
                                       title="Java I/O之FilenameFilter类列举出指定路径下某个扩展名的文件" target="_blank">Java I/O之FilenameFilter类列举出指定路径下某个扩展名的文件</a>
                                    <span class="text-muted">游其是你</span>
<a class="tag" taget="_blank" href="/search/FilenameFilter/1.htm">FilenameFilter</a>
                                    <div>这是一个FilenameFilter类用法的例子,实现的列举出“c:\\folder“路径下所有以“.jpg”扩展名的文件。        1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28  </div>
                                </li>
                                <li><a href="/article/2648.htm"
                                       title="C语言学习五函数,函数的前置声明以及如何在软件开发中合理的设计函数来解决实际问题" target="_blank">C语言学习五函数,函数的前置声明以及如何在软件开发中合理的设计函数来解决实际问题</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/c/1.htm">c</a>
                                    <div># include <stdio.h>

int f(void)		//括号中的void表示该函数不能接受数据,int表示返回的类型为int类型
{
	return 10;	//向主调函数返回10
}

void g(void)	//函数名前面的void表示该函数没有返回值
{
	//return 10;	//error 与第8行行首的void相矛盾
}

in</div>
                                </li>
                                <li><a href="/article/2775.htm"
                                       title="今天在测试环境使用yum安装,遇到一个问题: Error: Cannot retrieve metalink for repository: epel. Pl" target="_blank">今天在测试环境使用yum安装,遇到一个问题: Error: Cannot retrieve metalink for repository: epel. Pl</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a>
                                    <div>今天在测试环境使用yum安装,遇到一个问题: 
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again 
  
处理很简单,修改文件“/etc/yum.repos.d/epel.repo”, 将baseurl的注释取消, mirrorlist注释掉。即可。 
&n</div>
                                </li>
                                <li><a href="/article/2902.htm"
                                       title="单例模式" target="_blank">单例模式</a>
                                    <span class="text-muted">shuizhaosi888</span>
<a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/1.htm">单例模式</a>
                                    <div>单例模式        懒汉式 
public class RunMain {

	/**
	 * 私有构造
	 */
	private RunMain() {
	}
	
    /**
     * 内部类,用于占位,只有
     */
	private static class SingletonRunMain {
		priv</div>
                                </li>
                                <li><a href="/article/3029.htm"
                                       title="Spring Security(09)——Filter" target="_blank">Spring Security(09)——Filter</a>
                                    <span class="text-muted">234390216</span>
<a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a>
                                    <div>Filter 
目录 
1.1     Filter顺序 
1.2     添加Filter到FilterChain 
1.3     DelegatingFilterProxy 
1.4     FilterChainProxy 
1.5</div>
                                </li>
                                <li><a href="/article/3156.htm"
                                       title="公司项目NODEJS实践0.1" target="_blank">公司项目NODEJS实践0.1</a>
                                    <span class="text-muted">逐行分析JS源代码</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/nodejs/1.htm">nodejs</a>
                                    <div>  
一、前言 
        前端如何独立用nodeJs实现一个简单的注册、登录功能,是不是只用nodejs+sql就可以了?其实是可以实现,但离实际应用还有距离,那要怎么做才是实际可用的。 
        网上有很多nod</div>
                                </li>
                                <li><a href="/article/3283.htm"
                                       title="java.lang.Math" target="_blank">java.lang.Math</a>
                                    <span class="text-muted">liuhaibo_ljf</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a><a class="tag" taget="_blank" href="/search/lang/1.htm">lang</a>
                                    <div>System.out.println(Math.PI); 
System.out.println(Math.abs(1.2)); 
System.out.println(Math.abs(1.2)); 
System.out.println(Math.abs(1)); 
System.out.println(Math.abs(111111111)); 
System.out.println(Mat</div>
                                </li>
                                <li><a href="/article/3410.htm"
                                       title="linux下时间同步" target="_blank">linux下时间同步</a>
                                    <span class="text-muted">nonobaba</span>
<a class="tag" taget="_blank" href="/search/ntp/1.htm">ntp</a>
                                    <div>今天在linux下做hbase集群的时候,发现hmaster启动成功了,但是用hbase命令进入shell的时候报了一个错误  PleaseHoldException: Master is initializing,查看了日志,大致意思是说master和slave时间不同步,没办法,只好找一种手动同步一下,后来发现一共部署了10来台机器,手动同步偏差又比较大,所以还是从网上找现成的解决方</div>
                                </li>
                                <li><a href="/article/3537.htm"
                                       title="ZooKeeper3.4.6的集群部署" target="_blank">ZooKeeper3.4.6的集群部署</a>
                                    <span class="text-muted">roadrunners</span>
<a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E7%BE%A4/1.htm">集群</a><a class="tag" taget="_blank" href="/search/%E9%83%A8%E7%BD%B2/1.htm">部署</a>
                                    <div>ZooKeeper是Apache的一个开源项目,在分布式服务中应用比较广泛。它主要用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步、集群管理、配置文件管理、同步锁、队列等。这里主要讲集群中ZooKeeper的部署。 
  
1、准备工作 
我们准备3台机器做ZooKeeper集群,分别在3台机器上创建ZooKeeper需要的目录。 
  
数据存储目录</div>
                                </li>
                                <li><a href="/article/3664.htm"
                                       title="Java高效读取大文件" target="_blank">Java高效读取大文件</a>
                                    <span class="text-muted">tomcat_oracle</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>  读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:     Files.readLines(new File(path), Charsets.UTF_8);     FileUtils.readLines(new File(path));     这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致</div>
                                </li>
                                <li><a href="/article/3791.htm"
                                       title="微信支付api返回的xml转换为Map的方法" target="_blank">微信支付api返回的xml转换为Map的方法</a>
                                    <span class="text-muted">xu3508620</span>
<a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/map/1.htm">map</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1api/1.htm">微信api</a>
                                    <div>举例如下: 
<xml> 
   <return_code><![CDATA[SUCCESS]]></return_code> 
   <return_msg><![CDATA[OK]]></return_msg> 
   <appid><</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>