换CPU后电脑开机风扇转一秒之后一秒响一次呜,呜呜,响九声之后过一会就重启,换回以前的CPU也开不了机了啊啊

论完爆nodejs异步回调的异步模型async await_nodejs吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:9,593贴子:
论完爆nodejs异步回调的异步模型async await收藏
js里常见异步回调嵌套:post( function(result){
post(result ,function(data){
...response.end();}) })用async await就是这么写的: var result = await post();var data = await post(result); 我还可以悠哉的这个写法哪里有? 见wind.js源头就是C#,而C#的实现最为优雅。
魅族PRO 6s手机直降200元!给你多买一双新鞋、一条新耳机的理由!
nodejs自己整天吹自己性能,异步多么牛,其实这两点是被完爆的,这么多人用他才不是这些原因。
完全没有可读性
你的语言暴露了你的知识水平是多么初级, 有空好好学学设计模式.不要写什么回调了,没有3,5年设计模式的功力,写回调是自欺欺人.
连《HTTP权威指南》都没听说过, 在这里谈C#, 简直是丢人!
顶...C#系的在看...Wind,挺好的,模仿下...比Async/Promise/Step爽多了js的function里面不允许await直接出现function abc(){
await xxxAsync();只能写成一个假函数$await()}楼上一堆一来就喷C#,只能呵呵...
好激烈。。。稍安勿躁。。。楼主也不要一来就要勾引人家喷你嘛 = =
http权威指南,确实是不错的参考书
javascript,很灵活,喜欢什么语法糖,你都可以,自己实现。
javascript ,太灵活,表达能力强,不容易掌握。你喜欢什么语法糖,都可以用js自身实现。
上海工商外国语职业学院针对三校生低分注册200名,
看到你们很忙的样子
语言优势= = ..任何语言都有它的优势.Windows最初是Basic实现的,那时候连C都没有.而后来的版本才是C+汇编.其实大部分语言最初也只能做做数学题.一个程序也就是不断的在做不同的,复杂的数学题.Web后台技术上来说, 有很多种, ASP.NET. PHP ,JAVA , JavaScript(Node.js) . C语言(百度贴吧第一版). Python..等等数据库也有很多种, MySQL.
SQL DB2(IBM 银行数据库专用) 等等.至于能发挥的怎么样,很大程度上看开发者的水平.何来如此的语言优势论?
什么是语法糖?
另外出门右拐C#吧,走好不送。。事情用英语能表达,用汉语也能表达。但是成语用汉语表达要比英语强。歌剧用英语比汉语强。。
有啥好争的。。
function getdata(){/* 请你异步给data赋值并能够返回值 */ return data}; var data = getdata();//要能取到值。做不到这一点就别说什么请看看js的什么什么异步设计了,别搞笑了。
Async/await确实漂亮,天才之做。虽然本质上就是个回调,但是这个同步真的做的好
语法糖的东西争半天,更关心背后的东西吧。否则出bug了,够你喝一壶了。
nodejs可以不改代码多平台运作
说来说去,所说的性能完爆,没有给出实际数据,并且node是运用场景是在简单逻辑的高并发,资源所占比例要比c#少,c#依靠.net做后端,依赖性强。
另外,作为后端工具语言来讲,服务器的运作压力在相同大规模处理对比,asp.net消耗的资源要高于node,这是不可争辩的事实,一切的技术迭代更新都是为了更好的服务和降低相关人员资金时间等成本,
楼主给出得一楼代码也只是代码极速开发的例子,跟原生js和jq对比也是一样道理。但两行代码所实现的底层代码有多少,以及涉及到的库是那些楼主并没有说。我只针对一楼给出看法,其他楼的技术问题不涉及。楼主请轻拍轻喷。
另外说一句,早期的汇编我真的是在记事本学的,当年的电脑还是2万元的486电脑
楼主的标题确实有点踢馆的意思,有点招人恨。但客观的说,我很喜欢Wind.js的想法,谢谢楼主的介绍。这篇采访稿有很好的讲解我很多年前也有过类似的想法,把程序中顺序的部分拆成单独的执行单元,然后放到一个event loop上执行。从而实现同步程序的异步执行。但我没有老赵对程序设计语言广泛的涉猎,没能想出一个和现有语言结合好方法,只是尝试用这种方式自己做一个python的解释器,但后来也半途而废了。所以当我看到wind.js的这个设计时,颇有种惺惺相惜的感觉。不过如果是自己写程序,我估计不会用Wind.js。一来对eval不是太信任,总觉得这会给程序留下安全隐患,随便一个bug很容易被提升为安全漏洞;二来,我还是对语言固有的语法结构有些偏执,对这种通过compile的方式改变语言固有行为的做法缺乏安全感。
C# 可以是静态可以是动态,可同步可异步,可面向对象可函数式,当实现全部转成本机码后跨平台都不用虚拟机了,效率也上来了,加上原本的开发效率,,相信终有一日能走上码生巅峰。至于 node 的意义,无非就是采用异步方式面向并发,并且减少学习成本,个人认为后者的意义更大。
这没什么好喷的,每门语言都有它的存在道理,js可以用promise模式写出类似的,其实还是回调
之前看到过个评论说得很好,只有不写程序的人才会一天到晚为什么语言好,什么框架好打得头破血流,正经的工程师只会广泛学习各种知识,集合各种语言/框架的优势,来增进开发效率、提高程序质量。
楼主可能是C#的拥趸,从语言设计的方面讲,C#可以说是最优雅的面向对象设计语言,但我个人认为跨平台方面的不足很大程度制约了C#的发展(虽然在Mac/Linux平台上有mono,但毕竟缺乏广泛关注)。微软在鲍尔默时代的闭关锁国非常可怕,以行业老大自居,少合作、多树敌,使得一些很好的产品与技术(如.Net和C#)没能成为行业主流,实在令人扼腕叹息。
js也已经准备把async await学去了,之前那些说语法糖的,说js灵活什么都能实现的,呵呵。
贴吧本来就是娱乐的地方 多草草应该不会浪费流量的吧[SMILING FACE WITH OPEN MOUTH] 另楼主一定是个大黑客 给膜拜来了
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或Nodejs异步流程控制Async - 推酷
Nodejs异步流程控制Async
,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!
张丹(Conan), 程序员Java,R,PHP,Javascript
weibo:@Conan_Z
转载请注明出处:
Nodejs框架类库很多,功能相近的框架,本来只打算学一种写一种。之前写过流程控制框架
,本来是想着要支持一下“国人框架”。无奈啊,作者竟然放弃了维护,国人真的不靠谱啊!
“流程控制”本来是件比较简单的事,但是由于Nodejs的异步架构的实现方法,对于需要同步的业务逻辑,实现起来就比较麻烦。嵌套3-4层,代码就会变得的支离破碎了!
今天就遇到了一个业务逻辑,连续对数据库操作,前后有依赖。让我们看看Async是如何解决问题的。
不用不知道,一用真强大!!
Async函数介绍
async_demo使用介绍
场景:对数据库的连续操作
async_demo我的分支
1. Async介绍
Async是一个流程控制工具包,提供了直接而强大的异步功能。基于Javascript为Node.js设计,同时也可以直接在浏览器中使用。
Async提供了大约20个函数,包括常用的 map, reduce, filter, forEach 等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等。
项目地址:
2. Async安装
我的系统环境
win7 64bit
Nodejs:v0.10.5
Npm:1.2.19
MySQL:Server version: 5.6.11 MySQL Community Server (GPL)
我们做实验时,安装async有两个方式:
1. 独立安装async
2. 下载async demo代码安装
我建议大家用第二种方式安装,这样子实例的代码就都有了。
1). 独立安装async
~ D:\workspace\javascript&mkdir nodejs-async && cd nodejs-async
~ D:\workspace\javascript\nodejs-async&npm install async
npm http GET https://registry.npmjs.org/async
npm http 304 https://registry.npmjs.org/async
async@0.2.9 node_modules\async
打开网页,参照示例学习:
2). 下载async demo代码安装
~ D:\workspace\javascript&git clone :bsspirit/async_demo.git nodejs-async
~ D:\workspace\javascript&cd nodejs-async
~ D:\workspace\javascript\nodejs-async&npm install
npm http GET https://registry.npmjs.org/moment
npm http GET https://registry.npmjs.org/async
npm http 304 https://registry.npmjs.org/moment
npm http 304 https://registry.npmjs.org/async
async@0.2.9 node_modules\async
moment@2.1.0 node_modules\moment
这套demo示例,比较全面的介绍了async的使用,有中文注释。 感谢github社区原创作者freewind,代码更新的贡献者alsotang。
当然,我的分支中也修改了一部分代码。在本文最后,我会写到changelog中!
3. Async函数介绍
基于async的0.2.9版本。
async主要实现了三个部分的流程控制功能:
集合: Collections
流程控制: Control Flow
工具类: Utils
1). 集合: Collections
each: 如果想对同一个集合中的所有元素都执行同一个异步操作。
map: 对集合中的每一个元素,执行某个异步操作,得到结果。所有的结果将汇总到最终的callback里。与each的区别是,each只关心操作不管最后的值,而map关心的最后产生的值。
filter: 使用异步操作对集合中的元素进行筛选, 需要注意的是,iterator的callback只有一个参数,只能接收true或false。
reject: reject跟filter正好相反,当测试为true时则抛弃
reduce: 可以让我们给定一个初始值,用它与集合中的每一个元素做运算,最后得到一个值。reduce从左向右来遍历元素,如果想从右向左,可使用reduceRight。
detect: 用于取得集合中满足条件的第一个元素。
sortBy: 对集合内的元素进行排序,依据每个元素进行某异步操作后产生的值,从小到大排序。
some: 当集合中是否有至少一个元素满足条件时,最终callback得到的值为true,否则为false.
every: 如果集合里每一个元素都满足条件,则传给最终回调的result为true,否则为false
concat: 将多个异步操作的结果合并为一个数组。
2). 流程控制: Control Flow
series: 串行执行,一个函数数组中的每个函数,每一个函数执行完成之后才能执行下一个函数。
parallel: 并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序。
whilst: 相当于while,但其中的异步调用将在完成后才会进行下一次循环。
doWhilst: 相当于do…while, doWhilst交换了fn,test的参数位置,先执行一次循环,再做test判断。
until: until与whilst正好相反,当test为false时循环,与true时跳出。其它特性一致。
doUntil: doUntil与doWhilst正好相反,当test为false时循环,与true时跳出。其它特性一致。
forever: 无论条件循环执行,如果不出错,callback永远不被执行。
waterfall: 按顺序依次执行一组函数。每个函数产生的值,都将传给下一个。
compose: 创建一个包括一组异步函数的函数集合,每个函数会消费上一次函数的返回值。把f(),g(),h()异步函数,组合成f(g(h()))的形式,通过callback得到返回值。
applyEach: 实现给一数组中每个函数传相同参数,通过callback返回。如果只传第一个参数,将返回一个函数对象,我可以传参调用。
queue: 是一个串行的消息队列,通过限制了worker数量,不再一次性全部执行。当worker数量不够用时,新加入的任务将会排队等候,直到有新的worker可用。
cargo: 一个串行的消息队列,类似于queue,通过限制了worker数量,不再一次性全部执行。不同之处在于,cargo每次会加载满额的任务做为任务单元,只有任务单元中全部执行完成后,才会加载新的任务单元。
auto: 用来处理有依赖关系的多个任务的执行。
iterator: 将一组函数包装成为一个iterator,初次调用此iterator时,会执行定义中的第一个函数并返回第二个函数以供调用。
apply: 可以让我们给一个函数预绑定多个参数并生成一个可直接调用的新函数,简化代码。
nextTick: 与nodejs的nextTick一样,再最后调用函数。
times: 异步运行,times可以指定调用几次,并把结果合并到数组中返回
timesSeries: 与time类似,唯一不同的是同步执行
3). 工具类: Utils
memoize: 让某一个函数在内存中缓存它的计算结果。对于相同的参数,只计算一次,下次就直接拿到之前算好的结果。
unmemoize: 让已经被缓存的函数,返回不缓存的函数引用。
log: 执行某异步函数,并记录它的返回值,日志输出。
dir: 与log类似,不同之处在于,会调用浏览器的console.dir()函数,显示为DOM视图。
noConflict: 如果之前已经在全局域中定义了async变量,当导入本async.js时,会先把之前的async变量保存起来,然后覆盖它。仅仅用于浏览器端,在nodejs中没用,这里无法演示。
4. async_demo使用介绍
详细使用请参考github源代码:
每个函数的用法,有非常详细的实例!!
5. 场景:对数据库的连续操作
这个场景进背景情况,请参考文章:
原场景中,对数据串行操作,增删改查(CRUD),代码如下:
var mysql = require('mysql');
var conn = mysql.createConnection({
host: 'localhost',
user: 'nodejs',
password: 'nodejs',
database: 'nodejs',
port: 3306
conn.connect();
var insertSQL = 'insert into t_user(name) values(&conan&),(&fens.me&)';
var selectSQL = 'select * from t_user limit 10';
var deleteSQL = 'delete from t_user';
var updateSQL = 'update t_user set name=&conan update&
where name=&conan&';
conn.query(deleteSQL, function (err0, res0) {
if (err0) console.log(err0);
console.log(&DELETE Return ==& &);
console.log(res0);
conn.query(insertSQL, function (err1, res1) {
if (err1) console.log(err1);
console.log(&INSERT Return ==& &);
console.log(res1);
conn.query(selectSQL, function (err2, rows) {
if (err2) console.log(err2);
console.log(&SELECT ==& &);
for (var i in rows) {
console.log(rows[i]);
conn.query(updateSQL, function (err3, res3) {
if (err3) console.log(err3);
console.log(&UPDATE Return ==& &);
console.log(res3);
conn.query(selectSQL, function (err4, rows2) {
if (err4) console.log(err4);
console.log(&SELECT ==& &);
for (var i in rows2) {
console.log(rows2[i]);
//conn.end();
为了实现了串行操作,所有的调用都是在callback中实现的,5层嵌套结构。这种代码已经变得不可以维护了。所以,需要用async库,对上面的代码结构进行重写!
修改后的代码
var mysql = require('mysql');
var async = require('async');
var conn = mysql.createConnection({
host: 'localhost',
user: 'nodejs',
password: 'nodejs',
database: 'nodejs',
port: 3306
var sqls = {
'insertSQL': 'insert into t_user(name) values(&conan&),(&fens.me&)',
'selectSQL': 'select * from t_user limit 10',
'deleteSQL': 'delete from t_user',
'updateSQL': 'update t_user set name=&conan update&
where name=&conan&'
var tasks = ['deleteSQL', 'insertSQL', 'selectSQL', 'updateSQL', 'selectSQL'];
async.eachSeries(tasks, function (item, callback) {
console.log(item + & ==& & + sqls[item]);
conn.query(sqls[item], function (err, res) {
console.log(res);
callback(err, res);
}, function (err) {
console.log(&err: & + err);
控制台输出
deleteSQL ==& delete from t_user
{ fieldCount: 0,
affectedRows: 0,
insertId: 0,
serverStatus: 34,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0 }
insertSQL ==& insert into t_user(name) values(&conan&),(&fens.me&)
{ fieldCount: 0,
affectedRows: 2,
insertId: 45,
serverStatus: 2,
warningCount: 0,
message: '&Records: 2
Duplicates: 0
Warnings: 0',
protocol41: true,
changedRows: 0 }
selectSQL ==& select * from t_user limit 10
[ { id: 45,
name: 'conan',
create_date: Fri Sep 13 :51 GMT+0800 (中国标准时间) },
name: 'fens.me',
create_date: Fri Sep 13 :51 GMT+0800 (中国标准时间) } ]
updateSQL ==& update t_user set name=&conan update&
where name=&conan&
{ fieldCount: 0,
affectedRows: 1,
insertId: 0,
serverStatus: 2,
warningCount: 0,
message: '(Rows matched: 1
Changed: 1
Warnings: 0',
protocol41: true,
changedRows: 1 }
selectSQL ==& select * from t_user limit 10
[ { id: 45,
name: 'conan update',
create_date: Fri Sep 13 :51 GMT+0800 (中国标准时间) },
name: 'fens.me',
create_date: Fri Sep 13 :51 GMT+0800 (中国标准时间) } ]
代码一下读性就增强了许多倍,这就是高效的开发。
不用不知道,一用真强大!!!
当然还有其他的工作流框架来完成这件事情step,then.js,windjs。
windjs请参考:
6. async_demo我的分支
1. forEach.js改名为each.js
2. each.js文件中的async.forEach,改为async.each
3. map.js增加mapLimit函数
4. filter_reject.js对注释补充
5. filter_reject.js增加rejectSeries函数
6. reduce.js增加注释
7. detect.js增加注释
8. sortBy.js增加注释
9. some.js对注释补充
10. every.js对注释补充和修改
11. series.js调整注释格式
12. parallel.js调整注释格式
13. parallel.js增加parallelLimit函数
14. whilist_until.js调整注释格式
15. whilist_until.js增加doWhilst函数
16. whilist_until.js增加doUntil函数
17. whilist_until.js增加forever函数
18. waterfall.js调整注释格式
19. 增加compose.js文件
20. apply.js补充注释并增加一个实例
21. 修改nextTick.js实例
22. 增加times.js文件,包括times和timesSeries函数
23. 修改iterator.js实例
24. 修正auto.js关于第二个实例的错误解释
25. 修改queue.js实例和注释
26. 修改cargo.js文件
27. 增加applyEach.js文件
28. 修改utils.js实例和注释
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致Nodejs大批量下载图片入坑指南(使用async和bagpipe处理大并发量请求) - 推酷
Nodejs大批量下载图片入坑指南(使用async和bagpipe处理大并发量请求)
故事还得从头说起。
也无法访问了。曾经,在上面看到那么多优秀的安全类文章,一下子看不到了,颇觉得有点不适应。还好网上流传着民间的各种版本,于是我收集了一下,放在了
上。这些文章只是一些html文件,并不包含页面上的图片。幸运的是,图片的域名还可以继续访问,因此有必要把这些图片也抓取下来。
Wooyun Drops 文章在线浏览
使用Nodejs下载图片
抓取图片链接的过程在此不再详述,无非就是打开每个html页面,找到其中img标签的src属性。我们拿到了这些html页面的图片链接,是这个样子的:
varimageLinks = [
'http://static.wooyun.org//drops/6696130.png',
'http://static.wooyun.org//drops/7273224.png',
'http://static.wooyun.org//drops/7874324.png',
'http://static.wooyun.org//drops/1060411.png',
'http://static.wooyun.org//drops/560759.png',
'http://static.wooyun.org//drops/741969.png',
'http://static.wooyun.org//drops/588879.png',
'http://static.wooyun.org//drops/461288.png',
'http://static.wooyun.org//drops/455899.png',
'http://static.wooyun.org//drops/4570.png',
'http://static.wooyun.org//drops/6345.png',
'http://static.wooyun.org//drops/5704.png',
'http://static.wooyun.org//drops/0399.png',
'http://static.wooyun.org//drops/7633.png'
我们将其定义为一个模块备用(总共大约有13000个图片链接)。
在Nodejs中下载图片有很多解决方案,比如可以使用npm包
。本文中使用比较简单的版本,具体实现如下:
varfs =require("fs");
varpath =require('path');
varrequest =require('request');
vardownloadImage =function(src, dest, callback){
request.head(src, function(err, res, body){
// console.log('content-type:', res.headers['content-type']);
// console.log('content-length:', res.headers['content-length']);
request(src).pipe(fs.createWriteStream(dest)).on('close',function(){
callback(null, dest);
比如想要下载一个图片,可以这样子来做:
downloadImage("http://static.wooyun.org/7515.png","./1.png",function(err, data){
console.log(err)
if(data) {
console.log("done: "+ data);
对于我们想要的批量下载图片,最直观的做法就是写一个循环,然后去调用downloadImage方法。但是由于图片链接比较多,总是在下载到一部分图片后出现一些错误:
events.js:160
// Unhandled 'error'event
Error: Invalid URI "undefined"
at Request.init (/Users//dirread/node_modules/request/request.js:275:31)
at new Request (/Users/dirread/node_modules/request/request.js:129:8)
at request (/Users/dirread/node_modules/request/index.js:55:10)
at Request._callback (/Users//down.js:21:11)
at self.callback (/Users//dirread/node_modules/request/request.js:187:22)
at emitOne (events.js:96:13)
at Request.emit (events.js:188:7)
因此只有考虑使用异步方式来处理。
解决方案一: 使用async异步批量下载图片
是一个流程控制工具包,提供了直接而强大的异步功能。其提供了大约20个函数,包括常用的 map, reduce, filter, forEach 等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等。
npm install async --save
其使用方式也比较简单,比如下面的示例:
async.map(['file1','file2','file3'], fs.stat,function(err, results){
// results is now an array of stats for each file
async.filter(['file1','file2','file3'],function(filePath, callback){
fs.access(filePath, function(err){
callback(null, !err)
}, function(err, results){
// results now equals an array of the existing files
async.parallel([
function(callback){ ... },
function(callback){ ... }
], function(err, results){
// optional callback
async.series([
function(callback){ ... },
function(callback){ ... }
关于async的示例在此不再展开,具体可以参考
使用async下载图片
回到我们的程序,我们可以使用来实现。具体代码如下:
async.mapSeries(imageLinks,function(item, callback){
//console.log(item);
setTimeout(function(){
if(item.indexOf("http://static.wooyun.org") ===0) {
vardestImage = path.resolve("./images/", item.split("/")[item.split("/").length-1]);
downloadImage(item, destImage, function(err, data){
console.log("["+ index++ +"]: "+ data);
callback(null, item);
}, function(err, results){});
完整代码可以参看
node down.js
即可看到结果。
在Mac上使用的时候,偶尔会出现这样的错误:
Error: EMFILE, too many open files
有可能是因为Mac对并发打开的文件数限制的比较小,一般为256.所以需要修改一下。
在命令行执行:
echokern.maxfiles=65536 | sudo tee-a/etc/sysctl.conf
echokern.maxfilesperproc=65536 | sudo tee-a/etc/sysctl.conf
sudo sysctl -w kern.maxfiles=65536
sudo sysctl -w kern.maxfilesperproc=65536
然后可以在你的.bashrc文件中加入一行:
解决方案来自
解决方案二: 使用bagpipe批量下载图片
是朴灵大大做的一个在nodejs中控制并发执行的模块。
安装bagpipe
其安装和使用也比较简单:
npm install bagpipe --save
varbagpipe =newBagpipe(10);
varfiles = ['这里有很多很多文件'];
for(vari =0; i & files. i++) {
// fs.readFile(files[i], 'utf-8', function (err, data) {
bagpipe.push(fs.readFile, files[i], 'utf-8',function(err, data){
// 不会因为文件描述符过多出错
使用bagpipe批量下载图片
将我们的代码稍做修改,就可以使用bagpipe了。具体代码如下:
for(vari =0; i & imageLinks. i++) {
if(imageLinks[i].indexOf("http://static.wooyun.org") ===0) {
vardestImage = path.resolve("./images/", imageLinks[i].split("/")[imageLinks[i].split("/").length-1]);
bagpipe.push(downloadImage, imageLinks[i], destImage, function(err, data){
console.log("["+ index++ +"]: "+ data);
完整代码可以参考
node down.js
即可看到结果。
async和bagpipe都是很优秀的nodejs包,本身async功能十分强大,bagpipe使用起来简单方便,对原有的异步代码几乎不必做太多改动。因此可以根据自己喜好选择使用。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 电脑开机报警一直响 的文章

 

随机推荐