电商项目的并发量一般是多少_掌握这些,高并发秒杀系统就不用担心了!

很多小伙伴反馈说,高并发专题学了那么久,但是,在真正做项目时,仍然不知道如何下手处理高并发业务场景!

0ce41b78993cc6f3d77ac87f78242dc2.png

图片来自 Pexels

甚至很多小伙伴仍然停留在只是简单的提供接口(CRUD)阶段,不知道学习的并发知识如何运用到实际项目中,就更别提如何构建高并发系统了!

究竟什么样的系统算是高并发系统?今天,我们就一起解密高并发业务场景下典型的秒杀系统的架构,结合高并发专题下的其他文章,学以致用。

电商系统架构

在电商领域,存在着典型的秒杀业务场景,那何谓秒杀场景呢。简单的来说就是一件商品的购买人数远远大于这件商品的库存,而且这件商品在很短的时间内就会被抢购一空。

比如每年的 618、双 11 大促,小米新品促销等业务场景,就是典型的秒杀业务场景。

我们可以将电商系统的架构简化成下图所示:

f706bafc0e45813343247165cb78e8d2.png

由图所示,我们可以简单的将电商系统的核心层分为:负载均衡层、应用层和持久层。

接下来,我们就预估下每一层的并发量:

  • 假如负载均衡层使用的是高性能的 Nginx,则我们可以预估 Nginx 最大的并发度为:10W+,这里是以万为单位。
  • 假设应用层我们使用的是 Tomcat,而 Tomcat 的最大并发度可以预估为 800 左右,这里是以百为单位。
  • 假设持久层的缓存使用的是 Redis,数据库使用的是 MySQL,MySQL 的最大并发度可以预估为 1000 左右,以千为单位。Redis 的最大并发度可以预估为 5W 左右,以万为单位。

所以,负载均衡层、应用层和持久层各自的并发度是不同的,那么,为了提升系统的总体并发度和缓存,我们通常可以采取哪些方案呢?

①系统扩容

系统扩容包括垂直扩容和水平扩容,增加设备和机器配置,绝大多数的场景有效。

②缓存

本地缓存或者集中式缓存,减少网络 IO,基于内存读取数据。大部分场景有效。

③读写分离

采用读写分离,分而治之,增加机器的并行处理能力。

秒杀系统的特点

对于秒杀系统来说,我们可以从业务和技术两个角度来阐述其自身存在的一些特点。

秒杀系统的业务特点

这里,我们可以使用 12306 网站来举例,每年春运时,12306 网站的访问量是非常大的,但是网站平时的访问量却是比较平缓的,也就是说,每年春运时节,12306 网站的访问量会出现瞬时突增的现象。

再比如,小米秒杀系统,在上午 10 点开售商品,10 点前的访问量比较平缓,10 点时同样会出现并发量瞬时突增的现象。

所以,秒杀系统的流量和并发量我们可以使用下图来表示:

60563930fe6747a30bd764bfcc6daa41.png

由图可以看出,秒杀系统的并发量存在瞬时凸峰的特点,也叫做流量突刺现象。

我们可以将秒杀系统的特点总结如下:

76ca00d541693709d85427653c9eff71.png

①限时、限量、限价

在规定的时间内进行;秒杀活动中商品的数量有限;商品的价格会远远低于原来的价格,也就是说,在秒杀活动中,商品会以远远低于原来的价格出售。

例如,秒杀活动的时间仅限于某天上午 10 点到 10 点半,商品数量只有 10 万件,售完为止,而且商品的价格非常低,例如:1 元购等业务场景。

限时、限量和限价可以单独存在,也可以组合存在。

②活动预热

需要提前配置活动;活动还未开始时,用户可以查看活动的相关信息;秒杀活动开始前,对活动进行大力宣传。

③持续时间短

购买的人数数量庞大;商品会迅速售完。在系统流量呈现上,就会出现一个突刺现象,此时的并发访问量是非常高的,大部分秒杀场景下,商品会在极短的时间内售完。

秒杀系统的技术特点

我们可以将秒杀系统的技术特点总结如下:

7757010d7bfcbb83130768e82f8e0f1d.png

①瞬时并发量非常高

大量用户会在同一时间抢购商品;瞬间并发峰值非常高。

②读多写少

系统中商品页的访问量巨大;商品的可购买数量非常少;库存的查询访问数量远远大于商品的购买数量。

在商品页中往往会加入一些限流措施,例如早期的秒杀系统商品页会加入验证码来平滑前端对系统的访问流量,近期的秒杀系统商品详情页会在用户打开页面时,提示用户登录系统。这都是对系统的访问进行限流的一些措施。

③流程简单

秒杀系统的业务流程一般比较简单;总体上来说,秒杀系统的业务流程可以概括为:下单减库存。

针对这种短时间内大流量的系统来说,就不太适合使用系统扩容了,因为即使系统扩容了,也就是在很短的时间内会使用到扩容后的系统,大部分时间内,系统无需扩容即可正常访问。

那么,我们可以采取哪些方案来提升系统的秒杀性能呢?

秒杀系统方案

针对秒杀系统的特点,我们可以采取如下的措施来提升系统的性能。

176e7e8fb1d1d217c63fbe86da5dbcb2.png

①异步解耦

将整体流程进行拆解,核心流程通过队列方式进行控制。

②限流防刷

控制网站整体流量,提高请求的门槛,避免系统资源耗尽。

③资源控制

将整体流程中的资源调度进行控制,扬长避短。由于应用层能够承载的并发量比缓存的并发量少很多。

所以,在高并发系统中,我们可以直接使用 OpenResty 由负载均衡层访问缓存,避免了调用应用层的性能损耗。

大家可以到 https://openresty.org/cn/ 来了解有关 OpenResty 更多的知识。

同时,由于秒杀系统中,商品数量比较少,我们也可以使用动态渲染技术,CDN 技术来加速网站的访问性能。

如果在秒杀活动开始时,并发量太高时,我们可以将用户的请求放入队列中进行处理,并为用户弹出排队页面。

f574bd66580d549dd77662d0d69d4244.png

秒杀系统时序图

网上很多的秒杀系统和对秒杀系统的解决方案,并不是真正的秒杀系统,他们采用的只是同步处理请求的方案,一旦并发量真的上来了,他们所谓的秒杀系统的性能会急剧下降。我们先来看一下秒杀系统在同步下单时的时序图。

同步下单流程:

87a4e6f1652d69eb004b0071ae285fd8.png

①用户发起秒杀请求

在同步下单流程中,首先,用户发起秒杀请求。商城服务需要依次执行如下流程来处理秒杀请求的业务。

识别验证码是否正确:商城服务判断用户发起秒杀请求时提交的验证码是否正确。

判断活动是否已经结束:验证当前秒杀活动是否已经结束。

验证访问请求是否处于黑名单:在电商领域中,存在着很多的恶意竞争,也就是说,其他商家可能会通过不正当手段来恶意请求秒杀系统,占用系统大量的带宽和其他系统资源。

此时,就需要使用风控系统等实现黑名单机制。为了简单,也可以使用拦截器统计访问频次实现黑名单机制。

验证真实库存是否足够:系统需要验证商品的真实库存是否足够,是否能够支持本次秒杀活动的商品库存量。

扣减缓存中的库存:在秒杀业务中,往往会将商品库存等信息存放在缓存中,此时,还需要验证秒杀活动使用的商品库存是否足够,并且需要扣减秒杀活动的商品库存数量。

计算秒杀的价格:由于在秒杀活动中,商品的秒杀价格和商品的真实价格存在差异,所以,需要计算商品的秒杀价格。

注意:如果在秒杀场景中,系统涉及的业务更加复杂的话,会涉及更多的业务操作,这里,我只是列举出一些常见的业务操作。

②提交订单

订单入口:将用户提交的订单信息保存到数据库中。

扣减真实库存:订单入库后,需要在商品的真实库存中将本次成功下单的商品数量扣除。

如果我们使用上述流程开发了一个秒杀系统,当用户发起秒杀请求时,由于系统每个业务流程都是串行执行的,整体上系统的性能不会太高,当并发量太高时,我们会为用户弹出下面的排队页面,来提示用户进行等待。

476a9a6703321e23c20be1ce6b00d096.png

此时的排队时间可能是 15 秒,也可能是 30 秒,甚至是更长时间。这就存在一个问题:在用户发起秒杀请求到服务器返回结果的这段时间内,客户端和服务器之间的连接不会被释放,这就会占大量占用服务器的资源。

网上很多介绍如何实现秒杀系统的文章都是采用的这种方式,那么,这种方式能做秒杀系统吗?

答案是可以做,但是这种方式支撑的并发量并不是太高。此时,有些网友可能会问:我们公司就是这样做的秒杀系统啊!上线后一直在用,没啥问题啊!

我想说的是:使用同步下单方式确实可以做秒杀系统,但是同步下单的性能不会太高。

之所以你们公司采用同步下单的方式做秒杀系统没出现大的问题,那是因为你们的秒杀系统的并发量没达到一定的量级,也就是说,你们的秒杀系统的并发量其实并不高。

所以,很多所谓的秒杀系统,存在着秒杀的业务,但是称不上真正的秒杀系统,原因就在于他们使用的是同步的下单流程,限制了系统的并发流量。

之所以上线后没出现太大的问题,是因为系统的并发量不高,不足以压死整个系统。

如果 12306、淘宝、天猫、京东、小米等大型商城的秒杀系统是这么玩的话,那么,他们的系统迟早会被玩死,他们的系统工程师不被开除才怪!

所以,在秒杀系统中,这种同步处理下单的业务流程的方案是不可取的。

以上就是同步下单的整个流程操作,如果下单流程更加复杂的话,就会涉及到更多的业务操作。

异步下单流程:

7b862bdf9728b52be3e00acaaab98c6f.png

既然同步下单流程的秒杀系统称不上真正的秒杀系统,那我们就需要采用异步的下单流程了。异步的下单流程不会限制系统的高并发流量。

①用户发起秒杀请求

用户发起秒杀请求后,商城服务会经过如下业务流程。

检测验证码是否正确:用户发起秒杀请求时,会将验证码一同发送过来,系统会检验验证码是否有效,并且是否正确。

是否限流:系统会对用户的请求进行是否限流的判断,这里,我们可以通过判断消息队列的长度来进行判断。

因为我们将用户的请求放在了消息队列中,消息队列中堆积的是用户的请求,我们可以根据当前消息队列中存在的待处理的请求数量来判断是否需要对用户的请求进行限流处理。

例如,在秒杀活动中,我们出售 1000 件商品,此时在消息队列中存在 1000 个请求,如果后续仍然有用户发起秒杀请求,则后续的请求我们可以不再处理,直接向用户返回商品已售完的提示。

0531862365c95825d460865b1da9add5.png

所以,使用限流后,我们可以更快的处理用户的请求和释放连接的资源。

发送 MQ:用户的秒杀请求通过前面的验证后,我们就可以将用户的请求参数等信息发送到 MQ 中进行异步处理,同时,向用户响应结果信息。

在商城服务中,会有专门的异步任务处理模块来消费消息队列中的请求,并处理后续的异步流程。

在用户发起秒杀请求时,异步下单流程比同步下单流程处理的业务操作更少,它将后续的操作通过 MQ 发送给异步处理模块进行处理,并迅速向用户返回响应结果,释放请求连接。

②异步处理

我们可以将下单流程的如下操作进行异步处理:

  • 判断活动是否已经结束
  • 判断本次请求是否处于系统黑名单,为了防止电商领域同行的恶意竞争可以为系统增加黑名单机制,将恶意的请求放入系统的黑名单中。可以使用拦截器统计访问频次来实现。
  • 扣减缓存中的秒杀商品的库存数量。
  • 生成秒杀 Token,这个 Token 是绑定当前用户和当前秒杀活动的,只有生成了秒杀 Token 的请求才有资格进行秒杀活动。

这里我们引入了异步处理机制,在异步处理中,系统使用多少资源,分配多少线程来处理相应的任务,是可以进行控制的。

③短轮询查询秒杀结果

这里,可以采取客户端短轮询查询是否获得秒杀资格的方案。例如,客户端可以每隔 3 秒钟轮询请求服务器,查询是否获得秒杀资格。

这里,我们在服务器的处理就是判断当前用户是否存在秒杀 Token,如果服务器为当前用户生成了秒杀 Token,则当前用户存在秒杀资格。

否则继续轮询查询,直到超时或者服务器返回商品已售完或者无秒杀资格等信息为止。

采用短轮询查询秒杀结果时,在页面上我们同样可以提示用户排队处理中,但是此时客户端会每隔几秒轮询服务器查询秒杀资格的状态,相比于同步下单流程来说,无需长时间占用请求连接。

此时,可能会有网友会问:采用短轮询查询的方式,会不会存在直到超时也查询不到是否具有秒杀资格的状态呢?

答案是:有可能!这里我们试想一下秒杀的真实场景,商家参加秒杀活动本质上不是为了赚钱,而是提升商品的销量和商家的知名度,吸引更多的用户来买自己的商品。

所以,我们不必保证用户能够 100% 的查询到是否具有秒杀资格的状态。

④秒杀结算

验证下单 Token:客户端提交秒杀结算时,会将秒杀 Token 一同提交到服务器,商城服务会验证当前的秒杀 Token 是否有效。

加入秒杀购物车:商城服务在验证秒杀 Token 合法并有效后,会将用户秒杀的商品添加到秒杀购物车。

⑤提交订单

订单入库:将用户提交的订单信息保存到数据库中。

删除 Token:秒杀商品订单入库成功后,删除秒杀 Token。

这里大家可以思考一个问题:我们为什么只在异步下单流程的粉色部分采用异步处理,而没有在其他部分采取异步削峰和填谷的措施呢?

这是因为在异步下单流程的设计中,无论是在产品设计上还是在接口设计上,我们在用户发起秒杀请求阶段对用户的请求进行了限流操作,可以说,系统的限流操作是非常前置的。

在用户发起秒杀请求时进行了限流,系统的高峰流量已经被平滑解决了,再往后走,其实系统的并发量和系统流量并不是非常高了。

所以,网上很多的文章和帖子中在介绍秒杀系统时,说是在下单时使用异步削峰来进行一些限流操作,那都是在扯淡!

因为下单操作在整个秒杀系统的流程中属于比较靠后的操作了,限流操作一定要前置处理,在秒杀业务后面的流程中做限流操作是没啥卵用的。

高并发“黑科技”与致胜奇招

假设,在秒杀系统中我们使用 Redis 实现缓存,假设 Redis 的读写并发量在 5 万左右。

我们的商城秒杀业务需要支持的并发量在 100 万左右。如果这 100 万的并发全部打入 Redis 中,Redis 很可能就会挂掉,那么,我们如何解决这个问题呢?

接下来,我们就一起来探讨这个问题。在高并发的秒杀系统中,如果采用 Redis 缓存数据,则 Redis 缓存的并发处理能力是关键,因为很多的前缀操作都需要访问 Redis。

而异步削峰只是基本的操作,关键还是要保证 Redis 的并发处理能力。

解决这个问题的关键思想就是:分而治之,将商品库存分开放。

暗度陈仓

我们在 Redis 中存储秒杀商品的库存数量时,可以将秒杀商品的库存进行“分割”存储来提升 Redis 的读写并发量。

例如,原来的秒杀商品的 id 为 10001,库存为 1000 件,在 Redis 中的存储为(10001, 1000),我们将原有的库存分割为 5 份,则每份的库存为 200 件。

此时,我们在 Redis 中存储的信息为(10001_0, 200),(10001_1, 200),(10001_2, 200),(10001_3, 200),(10001_4, 200)。

d8eabd2315fde165f685e19d1ce2d07d.png

此时,我们将库存进行分割后,每个分割后的库存使用商品 id 加上一个数字标识来存储。

这样,在对存储商品库存的每个 Key 进行 Hash 运算时,得出的 Hash 结果是不同的。

这就说明,存储商品库存的 Key 有很大概率不在 Redis 的同一个槽位中,这就能够提升 Redis 处理请求的性能和并发量。

分割库存后,我们还需要在 Redis 中存储一份商品 id 和分割库存后的 Key 的映射关系,此时映射关系的 Key 为商品的 id,也就是 10001。

Value 为分割库存后存储库存信息的 Key,也就是 10001_0,10001_1,10001_2,10001_3,10001_4。在 Redis 中我们可以使用 List 来存储这些值。

在真正处理库存信息时,我们可以先从 Redis 中查询出秒杀商品对应的分割库存后的所有 Key,同时使用 AtomicLong 来记录当前的请求数量。

使用请求数量对从 Redis 中查询出的秒杀商品对应的分割库存后的所有 Key 的长度进行求模运算,得出的结果为 0,1,2,3,4。

再在前面拼接上商品 id 就可以得出真正的库存缓存的 Key。此时,就可以根据这个 Key 直接到 Redis 中获取相应的库存信息。

移花接木

在高并发业务场景中,我们可以直接使用 Lua 脚本库(OpenResty)从负载均衡层直接访问缓存。

这里,我们思考一个场景:如果在秒杀业务场景中,秒杀的商品被瞬间抢购一空。

此时,用户再发起秒杀请求时,如果系统由负载均衡层请求应用层的各个服务,再由应用层的各个服务访问缓存和数据库。

其实,本质上已经没有任何意义了,因为商品已经卖完了,再通过系统的应用层进行层层校验已经没有太多意义了!!

而应用层的并发访问量是以百为单位的,这又在一定程度上会降低系统的并发度。

为了解决这个问题,此时,我们可以在系统的负载均衡层取出用户发送请求时携带的用户 id,商品 id 和秒杀活动 id 等信息,直接通过 Lua 脚本等技术来访问缓存中的库存信息。

如果秒杀商品的库存小于或者等于 0,则直接返回用户商品已售完的提示信息,而不用再经过应用层的层层校验了。

针对这个架构,我们可以参见本文中的电商系统的架构图(正文开始的第一张图)。

写在最后

最后,附上并发编程需要掌握的核心技能知识图,祝大家在学习并发编程时,少走弯路。

f0f5e8b2dd363d3b2f9108ae79e1affd.png

后记:记住你比别人强的地方,不是你做过多少年的 CRUD 工作,而是你比别人掌握了更多深入的技能。

不要总停留在 CRUD 的表面工作,理解并掌握底层原理并熟悉源码实现,并形成自己的抽象思维能力,做到灵活运用,才是你突破瓶颈,脱颖而出的重要方向!

你在刷抖音,玩游戏的时候,别人都在这里学习,成长,提升,人与人最大的差距其实就是思维。你可能不信,优秀的人,总是在一起。。

作者:冰河技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490646.shtml

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

相关文章

matplotlib的colorbar设置显示的刻度个数和指定的刻度值

通过matplotlib.ticker.MaxNLocator(nbinsn)来设置colorbar上的刻度值个数 import matplotlib.ticker as ticker fig plt.figure() ax fig.gca() im ax.imshow(np.random.random([10, 10])) cb1 plt.colorbar(im, fraction0.03, pad0.05) tick_locator ticker.MaxNLocato…

Windows下MySQL数据库更改数据存储位置

Windows下MySQL数据库更改数据存储位置 1、创建一个新的存储数据文件 比如,我创建了一个文件 E:\MySQL_Service ,用来放mysql数据。 2、找到配置文件my.ini和mysql原本数据存放位置 之前用的是默认安装位置,我的电脑数据存放的默认路径为…

华为5G手机芯片被唱衰:美研究机构拆解6款量产机,不谈能力对标高通骁龙X50...

来源:凹非寺全球5G手机芯片到底哪家强?能力上来看,量产的华为巴龙5000参数超过骁龙X50,但最近英国研究机构IHS Markit拆解6款5G手机后给出另一面结论:华为手机5G,没高通骁龙有竞争力。IHS的结论&#xff0c…

CSS3-06 样式 5

浮动(Float) 关于浮动,要说的可能就是:一个设置了浮动的元素会尽量向左移动或向右移动,且会对其后的元素造成影响,其后的元素会排列在其围绕在其左下或右下部。似乎就这么简单,但是在实际开发中…

量子纠缠为什么不能用于瞬时通讯?

来源:数学职业家什么是信息? 信息的一个比较被认可的定义是1948年数学家香农在论文中提出的:信息是用来消除随机不定性的东西。比如,盒子里有一个硬币,它可以是正面向上,也可以是反面向上,在打开…

第二次冲刺每日站立会议03

会议照片: 会议内容: 祖浩然: 昨天:学习要进行优化的相关知识 今天:对前两个界面进行界面的修改 遇到的问题:设置背景图片之后按钮无法显示 刘洋: 昨天:学习要进行优化的相关知识 今…

cad菜单栏快捷键_天正建筑菜单栏不见了怎么调出来

在使用天正建筑得出时候,可能会因为不小心,把菜单栏关闭了,却一时不知道怎样打开,下面使用三种方式,教你将不见了的菜单栏调出来。方法一:使用键盘快捷键1.在界面中,我们可以看到,这…

图说报告 | “智能+”的终极版图:数字孪生世界

来源:阿里研究院数字孪生(Digital Twin)是近几年兴起的非常前沿的新技术,进入Gartner2019年十大战略技术趋势行列。今天,从300万个波音777零部件到人类心脏,其数字孪生体都可以复制。在未来的医疗领域&…

MATLAB画频率响应曲线(幅频特性和相频特性)并将横坐标转换为赫兹hz单位

matlab画频率响应曲线的函数为: [h,w] freqz(b,a,n) b,a:传递函数系数 h:频率响应 w:角频率,0~π 更多参数解释参考官方链接https://ww2.mathworks.cn/help/signal/ref/freqz.html?requesteddomaintrue 用freqz…

python3.6配置环境变量_python安裝及环境变量配置

一、安装 1.python下载 进入官网后选择download,选择windows进入如下页面1.1 python3.6.6版本下载 首先我们下载python3.6.6版本,下滑页面找到此位置,64位系统选择红色框框,32位选择蓝色框框点击进行下载 1.2 python2.7版本下载 下…

人与动物之间有没有一条不可逾越的鸿沟?——从基础存在论到生命哲学

来源:《哲学动态》 2018年第12期作者:舒红跃(湖北大学哲学学院)张哲(湖北省道德与文明研究中心)海德格尔《存在与时间》中对“此在”的生存论刻画是哲学史中的经典,此在“在-世界中-存在”是存在…

matlab显示曲线图中某个点的坐标值

在画好一幅曲线图后,有时候我们需要找出某个坐标的点,可以通过打开数据游标功能,此时鼠标点击的位置就会显示出坐标值,如下图: 此时保存下来的图也会带有显示的坐标值。 如果需要显示多个坐标的值,按住alt…

数字滤波器的差分方程和传递函数

差分方程用于描述线性、时不变、因果滤波器 数字滤波器的差分方程表示为: 对应的系统函数/传递函数为: a_k,b_k为滤波器系数 当a_k0时,滤波器当前的输出仅依赖于输入,而不依赖过去的输出,称为非递归滤波器…

2019年AI实力对决:美国领跑,中国追赶,欧盟弱势

来源: 智东西,Data Innovation美国当地时间8月18日,美国数据创新中心(Center for Data Innovation)发布针对中国、美国和欧洲三大地区的人工智能发展报告,报告显示,目前美国在AI发展中仍然保持领…

谷歌学术搜索技巧:查找一个句子的某个空应该用什么词

在写论文的时候经常遇到某个地方不知道应该用什么词比较专业的问题,举个例子: we used training strategy * in literature [10] *号处应该填什么词比较专业呢 这时可以在谷歌学术找到答案 在谷歌学术搜索中输入: "training strate…

关于未来的蝴蝶效应,《崛起的超级智能》创作有感

来源:刘锋科学网博客前言:2019年7月5日,当我拿到出版社寄出的《崛起的超级智能:互联网大脑如何影响科技未来》时,仿佛在捧着一个刚出生的婴儿。不是十月怀胎,而是历经12年的孕育,2年多的艰苦生产…

LaTeX表格字太贴近上面表线

如图所示,默认情况下有时候会出现表格中的字太贴近上面表线的问题: 解决方法:在\begin{tabular}{c|cc|cc|cc}命令前面加一句\renewcommand{\arraystretch}{1.5} 效果如图: \renewcommand{\arraystretch}{number}命令可以调整表线和…

造出世界最大芯片的公司,Cerebras Systems到底是怎样的存在?

来源:TechSugar最近,一颗巨型芯片的诞生引爆了芯片圈。其面积42225 平方毫米,拥有1.2 万亿个晶体管,400000 个核心,片上内存18G字节,内存带宽19PByte/s,fabric带宽100Pbit/s。是目前芯片面积最大…

python函数type的用意_python中type()是什么意思

type()是一个内建的获取变量类型的函数。 type()函数有两个用法,当只有一个参数的时候,返回对象的类型。当有三个参数的时候返回一个类对象。 语法:type(object) type(name, bases, dict) 具体用法: 一个参数type(object) 返回一个…

西方哲学史中49位哲学家的核心思想

来源:哲学与艺术泰勒斯——水是万物的始基这一命题开创了人类认识的一个新时代,拉开了从哲学的角度审视世界的大幕。阿那克西曼德——世界源于无定阿那克西曼德生于米利都,是泰勒斯的追随者和最出色的学生。阿那克西米尼——世界源于无限的空…