在没有服务器的情况下,excel文件如何实现数据分析和数据自动处理的功能?
例如:消费者购买商品时,会挑选商品然后再对商品付款。现在需要查找出用户挑中但是没有付款的商品并标识为未下单,付款的商品标注为下单。并且每隔一段时间自动执行上述操作。
目的:定时抽取上面的数据分析用户购买商品的行为。对比付款和选中未下单的商品的性能、价格等信息来发掘用户喜好,从而提高选品下单率。
注意:
首先想到的是利用SQL语言实现这样的查询。具体实现过程如下:
(1) 建立dingdan表和shangpin表:
-- ----------------------------
-- Table structure for dingdan
-- ----------------------------
DROP TABLE IF EXISTS `dingdan`;
CREATE TABLE `dingdan` (
`d_id` int(11) NOT NULL,
`UPC` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`d_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of dingdan
-- ----------------------------
INSERT INTO `dingdan` VALUES (1, '6972470560664');
INSERT INTO `dingdan` VALUES (2, '6972470560664');
INSERT INTO `dingdan` VALUES (3, '6972470561227');
INSERT INTO `dingdan` VALUES (4, '6972470561890');
INSERT INTO `dingdan` VALUES (5, '6972470561906');
SET FOREIGN_KEY_CHECKS = 1;
-- ----------------------------
-- Table structure for shangpin
-- ----------------------------
DROP TABLE IF EXISTS `shangpin`;
CREATE TABLE `shangpin` (
`UPC` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`商品` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`UPC`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of shangpin
-- ----------------------------
INSERT INTO `shangpin` VALUES ('6972470560657', 'A');
INSERT INTO `shangpin` VALUES ('6972470560664', 'A');
INSERT INTO `shangpin` VALUES ('6972470561210', 'D');
INSERT INTO `shangpin` VALUES ('6972470561227', 'B');
INSERT INTO `shangpin` VALUES ('6972470561890', 'C');
INSERT INTO `shangpin` VALUES ('6972470651791', 'B');
SET FOREIGN_KEY_CHECKS = 1;
(2) 将excel数据导入SQL软件中。
-- 搜索未下单的商品信息
SELECT *,
if(bb.UPC IS NULL,'未下单', '下单') as 下单情况
FROM shangpin aa
LEFT JOIN dingdan bb
ON aa.UPC = bb.UPC
(3) 将搜索结果导出为excel。
(4) 隔一段时间,需要人工重复上面的操作。
利用SQL查询、python做定时处理。具体实现过程如下:
(1) 重复方案1中的步骤1和2,将数据导入到数据库中。
(2) 用python连接数据库并查找数据。
import pymysql #导入PyMySQL库
import datetime
import warnings
import pandas as pd
import matplotlib.pyplot as plt
warnings.filterwarnings('ignore')
# 1. 连接数据库,创建连接对象 db
# 连接对象作用是:连接数据库、发送数据库信息、处理回滚操作(查询中断时,数据库回到最初状态)、
# 创建新的光标对象
def connect_database(database, password):
db = pymysql.connect(host ="localhost", #host属性
user ="sys", #用户名
password = password, #此处填登录数据库的密码
database = database, #数据库名
charset="utf8" # 如果中文显示乱码,则需要添加charset = "utf8"
)
return db
def read_data(db):
# 2. 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 3. 利用MySQL语句查找数据并转化为FrameData(包含列名)
try:
# 使用 execute() 方法执行 SQL 查询
mysql = "SELECT *, if(bb.UPC IS NULL,'未下单', '下单') as 下单情况 FROM shangpin aa LEFT JOIN dingdan bb ON aa.UPC = bb.UPC" # SQL语句
cursor.execute(mysql)
data = cursor.fetchall()
# 下面为将获取的数据转化为 dataframe 格式
columnDes = cursor.description #获取连接对象的描述信息
#print("cursor.description中的内容:",columnDes)
columnNames = [columnDes[i][0] for i in range(len(columnDes))] #获取列名
df = pd.DataFrame([list(i) for i in data],columns=columnNames) #得到的data为二维元组,逐行取出,转化为列表,再转化为df
print(df)
"""
db.commit()若对数据库进行了修改,需进行提交之后再关闭
"""
# 提交到数据库执行
#db.commit()
#print("OK")
except:
# 如果发生错误则回滚
db.rollback()
print("失败")
"""
使用完成之后需关闭游标和数据库连接,减少资源占用,cursor.close(),db.close()
db.commit()若对数据库进行了修改,需进行提交之后再关闭
"""
# 关闭数据库连接
cursor.close()
db.close()
return df
(3) 做定时任务
## 定时任务
import time
from apscheduler.schedulers.blocking import BlockingScheduler
def job():
dt = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
print('{} --- {}'.format(text, t))
database = 'sys' #数据库名称
password = 'sys' #数据库用户密码
db = connect_database(database, password)
data_sp = read_data(db)
data_sp.to_excel('../data/data_ans.xlsx', sheet_name='未下单情况')
scheduler = BlockingScheduler()
# 在每天22和23点的25分,运行一次 job 方法
scheduler.add_job(job, 'cron', hour='22-23', minute='25')
scheduler.start()
## 测试
# 执行任务
def time_printer():
# 输出时间
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
print('do func time :', ts)
# 定时任务
def loop_monitor():
while True:
time.sleep(20) # 暂停20秒
if __name__ == "__main__":
loop_monitor()
打开data_ans的excel文件即可查看数据。
程序需要一直运行,如果因为关机导致程序终止,需要重新运行。
python处理。具体实现过程如下:
(1) 导入excel数据并利用python完成数据查询,以excel的形式导出查询好的数据。
参考
import pandas as pd
def taskTime():
## 1. 分别导入2个表的数据
product = pd.read_excel('d:/python_code/crontab/data/taskdata.xlsx', sheet_name='商品') # 换成自己的路径和sheet名称
order = pd.read_excel('d:/python_code/crontab/data/taskdata.xlsx', sheet_name='订单')
## 2. 抽取数据
product=product.rename(columns={'UPC':'ID'}) # 对商品表里面的UPC重命名未ID(为了保留订单表里面的CPU着一列)
PO=pd.merge(product,order,left_on='ID', right_on='UPC',how='left') # 左连接抽取数据
PO.loc[pd.isnull(PO['UPC']), '下单情况'] = '未下单' # 找到选中但是未下单的数据标注为未下单
PO['下单情况'] = PO['下单情况'].fillna(value='下单') # 找到下单的数据,在'下单情况'这一列中标注为下单
## 3. 以excel的形式导出查询好的数据
PO = PO.loc[:, ['ID', 'UPC', '下单情况', '产品名称E', '产品参数C', '价格', '建议零售价','订单日期', '品牌', 'PO#', 'SKU','配置', '单价', '数量', '销售金额', '成本单价', '成本', '成本价含税/未税']] # 按列名导出需要的数据
PO.to_excel('d:/python_code/crontab/data/data_python.xlsx', sheet_name='未下单情况') # 导出excel表
return PO
if __name__ == "__main__":
taskTime()
print('执行成功')
(2) 定时处理
## 2. 定时处理
import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
def job():
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
print('执行时间 :', ts) # 输出时间
taskTime() # 执行代码
scheduler = BlockingScheduler() ## 定时
# 在每天17和23点的25分,运行一次 job 方法
scheduler.add_job(job, 'cron', hour='17-23', minute='22')
scheduler.start()
打开data_python的excel文件即可查看数据。
程序需要一直运行,如果因为关机导致程序终止,需要重新运行。
如果电脑需要关机,这时候代码不能一直运行,只能在需要数据的时候执行一下代码。有以下2个执行方法:
(1)用命令行执行代码,具体操作如下:
win + R 输入cmd 再输入 路径以及文件名
python d:\python_code\crontab\code\test.py
见下图
注意:数据还有代码的路径要写对
如果不想用命令行。直接用.bat文件执行也可以。
首先,需要新建一个.bat文件(用来运行脚本),在这个文件里面写上如下代码后保存:
python 路径\文件名.py
将这个文件放到桌面,使用时点击即可。
参考
将已经保存的.bat文件复制到该目录(C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup)下,可能杀毒软件会阻止,选择允许,然后重启电脑即可。
注:开机自启以后会打开一个cmd窗口,关闭窗口,python程序将停止运行。
注意:开启自启动可能会让电脑变慢、发热。。。
方案名称 | 优点 | 缺点 |
---|---|---|
SQL查询 | 代码简单,实现简单 | 数据一旦更新需要执行导入导出excel的操作。并且需要手动操作,不能自动提醒。 |
SQL、python处理 | 避免导出excel;可以自动提醒 | 还是需要导入excel;同时操作SQL和python;自动提醒需要程序一直运行 |
python处理 | 避免导入导出;可以自动提醒,只操作python | 查询时的处理不好做(对新手来说);自动提醒需要程序一直运行 |
优化python处理 | 避免导入导出;自动提醒不需要程序一直运行,开机自启动 | 需要配置一下 |
在没有服务器,以excel存储数据的情况下,同样可以利用SQL和python来做数据处理和分析,在遇到excel处理数据特别麻烦的时候可以选择上面的方案做处理,即可以锻炼自己的SQL和python编程的能力,又可以高效地解决问题。
一、Native切换到Flutter1、iOS在iOS中,Flutter的Framework中,提供了一个FlutterViewController来切换到Flutter页面@interfaceFlutterViewController :UIViewController<FlutterBinaryMessenger,FlutterTextureRegistry,FlutterPluginRegistry>复制可以看到FlutterViewController是继承自UIViewController,然后遵循了一些Flutter的相关协议。所以我们可以像正常使用UIViewController一样来使用Flutter页面#import<Flutter/Flutter.h> FlutterViewController*flutterViewController=[FlutterViewControllernew]; [flutterViewControllersetInitialRoute:@"initRoute"];复制2、Andorid在
又是一个愉快的周末,我们继续分享一些有趣的网站,readygo!介绍几个有趣的网站(十四) 介绍几个有趣的网站(十五) 介绍几个有趣的网站(十六) 介绍几个有趣的网站(十七) 介绍几个有趣的网站(十八)1.新冠病毒游戏在新冠病毒肆虐的当今,这个小游戏恰逢其时,不要让病毒碰触到你,挥拳或者出腿即可,哼哼哈嘿!https://coronavirus-ninja.com/2.照片魔方把照片放置到魔方上,在游戏的同时还是欣赏美的东西,真是一举两得呀http://zhaopianmofang.com/3.在线经典游戏看到这一个个熟悉的游戏名称,是不是仿佛回到了童真时代,快来体验一下吧,原汁原味的画面,让你体会像素风的魅力!https://dos.zczc.cz/4.本机刷新率测试硬件玩家的最爱,在线测试你本机的刷新率情况,支持测试手机、平板、PC、电视等多平台的屏幕刷新率https://testufo.com/5.虚拟币投资计算器该网站可以假设你在N年前投资了多少虚拟货币,再计算当下价值几何,要尝试一下吗https://ifinvested.com/6.喵星人状态码不知道有多少小伙伴有猫主子,如
今天,腾讯云正式宣布其数据库品牌TDSQL的全新战略升级计划及未来发展战略。未来,腾讯云原有的TDSQL、TBase、CynosDB三大产品线将统一升级为“腾讯云企业级分布式数据库TDSQL”。全新升级后的腾讯云TDSQL将涵盖分布式、分析型、云原生等多引擎融合的完整数据库产品体系。(从左至右分别为潘安群、王峰、李纲和林晓斌) 腾讯副总裁、腾讯云总裁邱跃鹏表示,作为国内数据库行业先行者,腾讯云深耕数据库领域十余年,服务客户数已经超过50万。未来,腾讯云还会在数据库的赛道上持续加码,并整合腾讯在QQ、微信等服务十几亿C端用户的能力、经验、资源,为B端客户持续提供好用、易用、安全的数据库产品。(腾讯副总裁、腾讯云总裁邱跃鹏) 从上云到云原生随着云计算的迅速发展和广泛应用,数据库正朝着“云+数据库”的方向演进。随着开发者使用习惯的变化以及传统行业的行业云构建的趋势,未来的数据库模式将逐渐云化。这个过程中,传统数据库越来越不能适应云在扩展性、可靠性和规模化的优势,“云原生”数据库应运而生。“云数据库的发展,目前正在经历从第一阶段‘数据库上云’,即从数据库到云数据库,到第二阶段‘从云数据库到云原
作者|AlbertoCuestaCañada译者|火火酱,责编|李雪敬由于所有已部署合约都有24KB的硬限制,所以除了少数极其简单的应用程序外,其他所有的Ethereum应用都是由多个智能合约组成的。如何才能确保各智能合约间的安全协作呢? 在将代码分解为多个可操作的合约后,我们便会发现有的合约中的函数需要通过另一个合约才能进行调用。例如,在Uniswapv2中,只有合约工厂(contractfactory)可以对UniswapPair进行初始化。(Uniswapv2:https://github.com/Uniswap/uniswap-v2-core/tree/master/contracts)对于Uniswap团队来说,只需要稍微检查一下就可以解决的问题对于很多其他项目来说,却需要从头开始重新编写调配解决方案。在了解问题和开发模式的过程中,我们深入理解了如何借助多个智能合约来构建应用程序,从而使Yield更加健壮且安全。(Yield:http://yield.is/)在本文中,我们将借助几个知名项目中的实例来深入分析智能合约的调配方式。希望大家在读完本文之后可以对照自己项目的需求,选
文/谢秉航(解读商业,解读增长)SaaS运营难做,已经是这个行业公认的难题。跟互联网行业不一样,SaaS行业其实分工已经非常标准化,从后到前,在每个环节,都有对应的岗位角色。而最大的问题就是,运营不在其中。嗯,运营不在其中。在美国SaaS已经建立的标准化岗位序列中,销售、售前、市场、客户成功都已经做了很详细的分类,但唯独没有运营。这个问题很容易理解,美国搞互联网也没有运营啊。对美国人来说,他们其实很难理解,运营和市场、销售、客户成功、产品的边界,到底在哪里。但这个问题放到中国来,就变成了非常特色的一部分。运营随着中国互联网的发展,已经成为了每个IT信息科技相关公司必备的岗位。所以中国SaaS公司招运营,已经成为了标配。对于SaaS老板们来说,第一运营必备,第二有很多脏活累活,交给运营就好。就是这种思维,导致了题主这个问题的出现,老板认为天生运营必有用,这其实已经是血统论了。但什么活儿都交给我,我到底应该做什么?运营做了那么多杂事,跟其他岗位比,怎么体现我的价值呢?其他回答说了很多,但我个人意见(可以接受讨论和辩论),还是没有把SaaS运营的核心职责说出来。那我给个结论,SaaS运营只有
前言delphi7中原本自带的一个Tmediaplayer控件,但是发现有不少视频是无法播放的,于是就想到了用windowsmediaplayer来进行播放。安装在Delphi7中选择“Component——ImportActiveXControl...”菜单,会弹出“ImportActiveX0”窗口。在列表中选择“WindowsMediaPlayer(Version1.0)”,再点击“Install”注意上面有两个WindowsMediaPlayer,我们要选择那个为wmp.dll的其中Classnames里面有三项,另一个是系统里自带的TMediaPlayer,我们不装。WindowsMediaPlayer基本属性URL:string可以指定媒体位置 enableContextMenu:Boolean显示/不显示播放位置的右键菜单 fullScreen:boolean全屏显示 stretchToFit:boolean非全屏状态时是否伸展到最佳大小 uMode:string播放器的模式,full:有下面的控制条; none:只有播放部份没有控制条 playState:integer
LearningFeaturePyramidsforHumanPoseEstimation ICCV2017 Torch:https://github.com/bearpaw/PyraNet本文主要关注人体部件中的尺度问题,scalevariationsofhumanbodyparts,这种尺度变化主要发生在cameraviewchangesorsevereforeshorteninghappens提出的解决思路是learningfeaturepyramids,设计了PyramidResidualModule(PRMs)来增强CNN网络对尺度信息的提取能力。同时我们发现在initializetheweightsofmulti-branchnetworks存在问题以及theproblemofactivationvarianceaccumulationintroducedbyidentitymappingmaybeharmfulinsomescenarios,对于这两个问题我们分别提出解决的方法。3Framework3.1.RevisitingStackedHourglassNetwork
AgentAuditedClient已审核代客信息 被如下接口引用:DescribeAgentAuditedClients。 名称 类型 描述 Uin String 代理商账号ID ClientUin String 代客账号ID AgentTime String 代客审核通过时间戳 ClientFlag String 代客类型,可能值为a/b/c ClientRemark String 代客备注 ClientName String 代客名称(首选实名认证名称) AuthType String 认证类型,0:个人,1:企业;其他:未认证或无效值 AppId String 代客APPID LastMonthAmt Integer 上月消费金额 ThisMonthAmt Integer 本月消费金额 HasOverdueBill Integer 是否欠费,0:不欠费;1:欠费 ClientType String 客户类型:可以为new(自拓)/assign(指派)/old(官网)/direct(直销)/direct_newopp(直销(
优惠券的学问 营销不简单,特别是为企业提供营销服务更难。就拿常见的优惠券来说,学问也很大! 优惠券分为:当次用(指在获新客)、下次用(促进二次消费)、金额递进用(刺激购买金额升高) 根据行业不同,对优惠券的需求也不同。就拿电商举例:生鲜、食品类适合“下次用”类型券,因为它们是高频消费场景。而家电、3C类适合“金额递进用”类型券,因为它们是高额低频消费场景。“金额递进用”指的是满额立减这种,比如送你一2000减200的券,当你选择手机时就会选择高于2000的商品,原本可能你的心里价位是1500的预算。 口碑营销 订阅号的软文等属于“口碑营销”的范畴,依托吃瓜群众的传播、耳濡目染……大公司都有舆情监控,统计、分析几大平台(twitter、Facebook等)自己品牌的美誉度,可口可乐以此调整在世界各地的广告内容,减肥可乐(白色包装)率先只在日本销售,因为舆情监控到日本人很关注减肥(虽然胖子不多,因为日本动漫里都是12头身的竹竿比例,日本人的审美关系) 网红店的营销学——“潜在社交需求”之一“美食社交” 现在各种“网红店”层出不穷,卖茶饮的、卖冰激凌的
在实际环境中,服务器很多CGI由于一些历史原因,必须允许空Referer的请求。比如:老的客户端版本请求的时候就没有Referer,总不能在服务端一刀切,让老版本的用户都无法正常使用了吧。 这样的CGI就存在CSRF攻击的风险。那么我们该如何在真实环境中构造一个可利用的POC呢? 我们知道正常的页面跳转,浏览器都会自动带上Referer,那么现在的问题就变成了什么情况下浏览器会不带Referer?通过一些资料,可以大致总结为两种情况: 1.通过地址栏,手动输入;从书签里面选择;通过实现设定好的手势。上面说的这三种都是用户自己去操作,因此不算CSRF。 2.跨协议间提交请求。常见的协议:ftp://,http://,https://,file://,javascript:,data:.最简单的情况就是我们在本地打开一个HTML页面,这个时候浏览器地址栏是file://开头的,如果这个HTML页面向任何http站点提交请求的话,这些请求的Referer都是空的。那么我们接下来可以利用data:协议来构造一个自动提交的CSRF攻击。当然这个协议是IE不支持的,我们可以换用javascript
1 首先大家可以看到的是我们的这个oracle的数据库服务,每次我们用我们的oracle数据库的时候进行打开的两个服务 OracleOraDb11g_home1TNSListener OracleServiceORCL 2 来打开我们的记事本,然后进行编辑 3 在我们的记事本编辑框中输入我们这两句代码: scstartOracleServiceORCL scstartOracleOraDb11g_home1TNSListener 这个是我们的启动服务的代码 4 随后将我们的文本先保存到我们的桌面上,当然它现在是一个txt文件类型的 5 随后点击我们的文件进行重命名,将它的格式改为bat后缀名,随着格式的改变它的图片也会转换成位另外的一种样式 6 这就是我们的启动oracle数据服务的快捷文档 7 当然了我们的停止服务也是如此的,只不过在第三步中的编辑内容上代码为: scstopOracleServiceORCL scstop
1248.B.陆历川玩数位 TimeLimit:500MS MemoryLimit:131072KBTotalSubmission(s): 24 AcceptedSubmission(s): 12 Description AnumberXhavendigits(A1A2A3......An) F(x)=A1*2n-1+A2*2n-1.....+An-1*21+An*20 Now,giveyoutwonumberA,B Youneedtocalculatehowmanynumber'sF(x)isnomorethanF(A)between0toB Input T(0<T<=10000)TisTestCase A,B(0<=A,B<=1000000000) Output Answer SampleInput 1 11复制 SampleOutput Case#1:2复制 Source Unknow
1.案例-购物车-购物车列表展示 1.1item_cart.xml <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" xmlns:tools="http://schemas.android.com/tools" android:background="@color/white" android:orientation="horizontal"> <ImageView android:id="@+id/iv_thumb" android:layout_width="85dp" android:layout_height="85dp" android:scaleType="fitCenter" tools:src="@drawable/xiaomi"/> <LinearLayout android:layout_wid
Nginx实现动静分离 一、概述 1.1、Nginx动静分离基本概述 动静分离,通过中间件将'动态请求'和'静态请求'进行分离 通过中间件将动态请求和静态'请求分离',可以'节省不必要的请求消耗',同时能'减少请求的延时'。 动静分离是指在web服务器架构中,将'静态页面'与'动态页面'或者说是'静态内容接口'和'动态内容接口'分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。 #动静分离只有好处: #动静分离后,即使动态服务不可用,但静态资源不会受到影响 复制 1.2、前后分离 #接口与视图分开部署,专业的人做专业的事。 例如:前端使用vue.js,后端只需要提供接口即可。前端项目于后端项目都是独立部署的 如果我们静态资源与动态资源存放在同一台服务器上面,当静态资源不断增多的时候,我们的服务器访问是扛不住的,因为静态资源消耗过多的带宽,导致静态资源无法访问或者访问的非常慢。 复制 CDN扩展知识 CDN的全称是ContentDeliveryNetwork,即'内容分发网络'。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传
前一阶段拜读了阿里团队的flexible.js,但是flexible的封装感觉还是不完美,因为flexible还是要依赖less/sass之类的编译执行,所以就存了一些问题,我把这些问题进行整理。 优点: 1.代码量明显减少 2.开发效率变高,css管理式开发,css逻辑清晰 3.less+flexible.js能否适配各种手机型号,实现各个尺寸屏幕的兼容 4.less学习成本低(几乎为零) 缺点: 1.less编译成css执行,团队开发git版本控制器的坑,这个不多说了 2.因为是less编译,所以不好后期维护,虽然节省了开发成本,但是很有可能这些节省的开发成本在后期debug的时候增加成本预算 3.如果用css线上,合并肯定又坑,因为你并不知道less是如何取解析编译成css文件的 4.一般项目线上less和gulp编译执行,但是less编译还是需要时间有可能渲染不出来css(几率比较小) 综合上面优缺点,只要合理的规范的使用less,利是远远的大于弊的!尤其是flexible,节省了适配各个型号手机的时间,大大的增加了开发效率! 今天突发奇想,我们flexible.js其实用到的
nvm 由于node.js的版本一直处于不断更新中,所以我们需要一个版本管理器来更好的使用node.js。 nvm是一个开源的node版本管理器,通过它,你可以下载任意版本的node.js,还可以在不同版本之间切换使用。 注意:安装nvm之前,要确保当前机子中不存在任何版本的node,如果有,则卸载掉。 github:https://github.com/creationix/nvm 安装命令: sudoapt-getupdate sudoaptinstallcurl curl-o-https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh|bash source~/.bashrc 复制 node 使用nvm的相关命令安装node。 #查看官方提供的可安装node版本 nvmls-remote #安装执行版本的node,例如:nvminstallv10.15.2 nvminstall<version> #卸载node版本,例如:nvmuninstallv10.15.2 nvmuninstal
假如面试回答js的运行机制时,你可能说出这么一段话:“Javascript的事件分同步任务和异步任务,遇到同步任务就放在执行栈中执行,而碰到异步任务就放到任务队列之中,等到执行栈执行完毕之后再去执行任务队列之中的事件。”但你能说出背后的原因吗? 先理解相关概念 线程与进程 进程:是系统资源分配和调度的单元。一个运行着的程序就对应了一个进程。一个进程包括了运行中的程序和程序所使用到的内存和系统资源。 线程:线程是进程下的执行者,一个进程至少会开启一个线程(主线程),也可以开启多个线程。 同步和异步 同步和异步关注的是:消息(结果)通信机制 同步:发出调用后,在没有得到结果前,该调用不返回。但是一旦调用返回,就得到返回值 异步:发出调用后,调用直接返回,没有返回结果。但结果由回调函数给出,至于什么时候给出,不知道。(这个回调函数肯定是在当前js执行完后才执行) 阻塞与非阻塞 阻塞和非阻塞关注的是:程序在等待调用结果时的状态. 阻塞调用:调用结果返回之前,当前线程被挂起。调用线程只有在得到结果后才会返回。非阻塞调用:在不能立刻得到结果之前,该调用不会