K8s 原生 Serverless 实践:ASK 与 Knative

一、为什么需要 Knative

%title插图%num

K8s 目前已成为云原生市场上的主流操作系统,K8s 对上通过数据抽象暴露基础设施能力,比如 Service、Ingress、Pod、Deployment 等,这些都是通过 K8s 原生 API 给用户暴露出来的能力;而对下 K8s 提供了基础设施接入的一些标准接口,比如 CNI、CRI、CRD,让云资源以一个标准化的方式进入到 K8s 的体系中。

K8s 处在一个承上启下的位置,云原生用户使用 K8s 的目的是为了交付和管理应用,也包括灰度发布、扩容缩容等。但是对用户来说,实现这些能力,通过直接操作 K8s API 难免有些复杂。另外节省资源成本和弹性对于用户来说也越来越重要。

那么,如何才能简单地使用 K8s 的技术,并且实现按需使用,*终实现降本增效的目的呢?答案就是 Knative。

二、Knative简介
1. Knative 是什么
定义

%title插图%num
Knative 是一款基于 Kubernetes 的 Serverless 编排引擎,Knative 一个很重要的目标是制定云原生跨平台的编排标准,它通过整合容器构建、工作负载以及事件驱动来实现这一目的。

Knative 社区当前贡献者主要有 Google、Pivotal、IBM、Red Hat,可见其阵容强大,另外还有 CloudFoundry、OpenShift 这些 PAAS 提供商也都在积*地参与 Knative 的建设。

核心模块

%title插图%num

Knative 核心模块主要包括两部分:事件驱动框架 Eventing 和提供工作负载的 Serving,接下来本文主要介绍 Serving 相关的一些内容。

2. 流量灰度发布
以一个简单的场景为例:

在 K8s 中实现基于流量的灰度发布

%title插图%num

如果要在 K8s 中实现基于流量的灰度发布,需要创建对应的 Service 与 Deployment,弹性相关的需要 HPA 来做,然后在流量灰度发布时,要创建新的版本。

以上图为例,创始版本是 v1,要想实现流量灰度发布,我们需要创建一个新的版本 v2。创建 v2 时,要创建对应的 Service、Deployment、HPA。创建完之后通过 Ingress 设置对应的流量比例,*终实现流量灰度发布的功能。

在 Knative 中实现基于流量的灰度发布

%title插图%num

如上图所示,在 Knative 中想要实现基于流量的灰度发布,只需要创建一个 Knative Service,然后基于不同的版本进行灰度流量,可以用 Revision1 和 Revision2 来表示。在不同的版本里面,已经包含了自动弹性。

从上面简单的两个图例,我们可以看到在 Knative 中实现流量灰度发布时,需要直接操作的资源明显较少。

3. Knative Serving 架构

%title插图%num

**Service **
Service 对应 Serverless 编排的抽象,通过 Service 管理应用的生命周期。Service 下又包含两大部分:Route 和 Configuration。

Route
Route 对应路由策略。将请求路由到 Revision,并可以向不同的 Revision 转发不同比例的流量。

Configuration
Configuration 配置的是相应的资源信息。当前期望状态的配置。每次更新 Service 就会更新 Configuration。

Revision
每次更新 Configuration 都会相应得到一个快照,这个快照就是 Revision,通过 Revision 实现多版本管理以及灰度发布。

我们可以这样理解:Knative Service ≈ Ingress + Service + Deployment + 弹性(HPA)。

4. 丰富的弹性策略
当然,Serverless 框架离不开弹性, Knative 中提供了以下丰富的弹性策略:

基于流量请求的自动扩缩容:KPA;
基于 CPU、Memory 的自动扩缩容:HPA;
支持定时 + HPA 的自动扩缩容策略;
事件网关(基于流量请求的精准弹性)。
三、Knative 和 ASK 融合
1. ASK:Serverless Kubernetes

%title插图%num

如果要准备 ECI 资源的话,需要提前进行容量规划,这无疑违背了 Serverless 的初衷。为摆脱 ECI 资源的束缚,不必提前进行 ECI 资源规划,阿里云提出了无服务器 Serverless——ASK。用户无需购买节点,即可直接部署容器应用,无需对节点进行维护和容量规划。ASK 提供了 K8s 兼容的能力,同时*大地降低了 K8s 的使用门槛,让用户专注于应用程序,而不是底层基础设施。

ASK 提供了以下能力:

免运维
开箱即用,无节点管理和运维,无节点安全维护,无节点 NotReady,简化 K8s 集群管理。

*致的弹性扩容
无容量规划,秒级扩容,30s 500pod。

低成本
按需创建 Pod,支持 Spot,预留实例券。

兼容 K8s
支持 Deployment/statfulset/job/service/ingress/crd 等。

存储挂载
支持挂载云盘、NAS、OSS 存储券。

Knative on ASK
基于应用流量的自动弹性,开箱即用,缩容到*小规格。

Elastic Workload
支持 ECI 按量和 Spot 混合调度。

集成 ARMS/SLS 等云产品
2. Knative 运维复杂度
Knative 运维主要存在三个方面的问题:Gateway、Knative 管控组件和冷启动问题。

%title插图%num

如上图所示,在 Knative 中管控组件会涉及到相应的 Activator,它是从 0 到 1 的一个组件;Autoscaler 是扩缩容相关的组件;Controller 是自身的管控组件以及网关。对于这些组件的运维,如果放在用户层面做,无疑会加重负担,同时这些组件还会占用成本。

%title插图%num

除此之外,从 0 到 1 的冷启动问题也需要考虑。当应用请求过来时,*个资源从开始到启动完成需要一段时间,这段时间内的请求如果响应不及时的话,会造成请求超时,进而带来冷启动问题。

对于上面说到的这些问题,我们可以通过 ASK 来解决。下面看下 ASK 是如何做的?

3. Gateway 和 SLB 融合

%title插图%num

相比于之前 Istio 提供的能力,我们需要运营管控 Istio 相关的组件,这无疑加大了管控成本。实际上对于大部分场景来说,我们更关心网关的能力,Istio 本身的一些服务(比如服务网格)我们其实并不需要。

在 ASK 中,我们将网关这一层通过 SLB 进行了替换:

降成本:减少了十几个组件,大大降低运维成本和 IaaS 成本;
更稳定:SLB 云产品服务更稳定,可靠性更高,易用性也更好。
4. 管控组件下沉

%title插图%num

对于 Knative 管控组件,ASK 做了一些托管:

开箱即用:用户直接使用 Serverless Framework,不需要自己安装;
免运维、低成本:Knative 组件和 K8s 集群进行融合,用户没有运维负担,也无需承担额外的资源成本;
高管控:所有组件都在管控端部署,升级和迭代更容易。
5. 优雅的保留实例
在 ASK 平台中,我们提供了优雅保留实例的能力,其作用是免冷启动。通过保留实例,消除了从 0 到 1 的冷启动时间。当我们缩容到 0 的时候,并没有把实例真正缩容到 0,而是缩容到一个低规格的保留实例上,目的是降低成本。

免冷启动:通过保留规格消除了从 0 到 1 的 30 秒冷启动时间;
成本可控:突发性能实例成本比标准规格实例降低 40% 的成本,如果和 Spot 实例结合还能再进一步降低成本。
四、实操演示
*后进行动手实践演示,以一家咖啡店(cafe)为例,演示内容主要有:

在 ASK 集群中安装 Knative;
部署 coffee 服务;
访问 coffee 服务;
保留实例。
————————————————
版权声明:本文为CSDN博主「阿里巴巴云原生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/alisystemsoftware/article/details/115331140

华为云TaurusDB计算存储分离架构:让数据“身”分离,“心”凝聚

随着企业的不断发展,企业产生大量的数据,这些数据既要保存下来,又要它们产生相应的价值。事实上,如何将数据存储并产生价值是每个企业不容忽视的问题。而在数字化和云端数据库蓬勃发展的今天,数据上云成为了众多企业数据库的首选。

%title插图%num

在2019年HC大会上,华为重磅推出*新一代高扩展海量存储分布式数据库——TaurusDB,它拥有一个*大的特点就是将存储和计算以一种分离的架构形式运行。很多人就会问到,华为云为什么会设计这款产品?核心竞争力是什么?对比原生MySQL的优势有哪些?借此时机,CSDN记者有幸采访到了华为云TaurusDB数据库资深技术专家,现在就请他来为我们一一解答。

源起:TaurusDB数据库的设计初衷
当前,中国有近70% 新型企业的业务因数据挑战而受影响。现在随着互联网的飞速发展,所产生的数据量是以几何的模式在增长。数据量大、数据种类多对数据库的性能、可靠性等要求也越来越高。像金融行业,不仅需要高可靠的存储设备性能,更要保障数据的安全。

“传统的数据库及数据库上云模式,越来越不能满足客户业务的快速扩展和智能运维需求,客户需要的是一套能够灵活扩展、智能诊断、支持跨云融合的新一代云端原生数据库系统。与大数据相辅相成的云数据库,尤其是基于云场景架构设计的云原生分布式数据库,成为了企业的*佳选择。“华为云数据库专家在谈及TaurusDB设计初衷时讲到,分布式数据库现在是一个大的新趋势,而TaurusDB的定位是企业级分布式数据库,针对企业的高并发、海量吞吐等需求,有着非常优异的表现。

华为云数据库专家介绍到,TaurusDB是*个基于MySQL 8.0开发的高性能新一代企业级分布式数据库,设计目标是利用云原生设计解决传统的关系型数据库问题。它支持并行查询,DDL操作的原子性,异步写日志等优化。业界同类型的数据库都是基于MySQL 5.6、5.7开发的,而TaurusDB的设计研发充分发挥了华为公司的全栈优势,利用数据库软件与底层硬件、CPU、网络、存储芯片等垂直产品技术的整合,发挥出华为软硬件结合后的整体*大优势,并且使用了自研Hi1822芯片,以及下一代高性能DFV存储服务器、RDMA网络。

蝶变:左手计算,右手存储
TaurusDB 作为一个分布式集群架构,采用计算与存储分离、日志即数据的架构设计,支持1写15读的模式,性能可达到原生MySQL的7倍。此外,TaurusDB是构建在共享分布式存储上,存储空间*高达128T,能跨AZ部署。

%title插图%num

TaurusDB利用计算存储分离架构,可以把数据库逻辑下推到存储层进行计算,充分发挥存储层的分布式计算能力,进一步提升数据库的性能,减少网络开销。针对TaurusDB的架构优势,华为云数据库专家分别就计算和存储两个层面做了阐述:

计算层

在计算层,TaurusDB采用了无锁优化,异步提交,主备机同步不再使用Binlog的模式。这个模式的好处就是大大释放了主机的压力,主机只管做“自己”的事情,无需和备机进行交互。相比传统的MySQL数据库,TaurusDB只需要5分钟就可以增加一个备机,即使增加到15个备机也不会有任何影响,而MySQL*多可加到5个左右的备机。

华为云数据库专家在采访中举例,Binlog的缺点是需要同步给所有的备机,相当于有多少备机就要同步到多少台机器中,这样做的后果就是直接拉低了主机的正常工作性能。因此,传统架构*多可以增加到5台备机,再增加备机就会导致无法正常工作。

存储层

TaurusDB存储层实现数据分片存储,保证故障快速恢复。例如:一共有1TB数据,即使只有1个字节的内容损坏,也需要恢复1TB的数据,且恢复时间非常长。但是如果实现分片存储,我们只需要恢复被破坏数据所在的分片即可。比如1TB数据,TaurusDB把它分成100个10GB的数据分片,如果只是某个分片坏了,就只需要恢复这10GB的数据即可。

“存储池化带来的好处就是,用户不需要担心存储空间不够用,存储层会根据当前容量进行自动扩容。”专家表示,客户无需担心存储容量的问题,TaurusDB自动在后台进行扩容。“按需收费,自动扩容”为客户带来非常人性化的产品体验服务。

谈及数据,“安全”就是不得不提的一个话题。在安全方面,TaurusDB的安全性能比原生MySQL更高。首先,数据分布式存储,并且是跨可用区的多副本,确保数据0丢失。其次,存储层本身就有一套成熟的数据隔离和加密机制。再次,MySQL8.0相对比原生MySQL 5.6、MySQL 5.7,在安全性方面也做了很多的优化和提升。*后, TaurusDB通过与DBSS(数据库安全服务)的透明化集成,不用修改应用,只需在界面配置即可享受智能化的安全保障,可以防御各种网络攻击,防护数据泄露。当前,华为云数据库已通过可信云认证,可提供国际级的隐私和数据保护。

目前,关系型数据库的场景都可以使用TaurusDB,尤其像读写负载*高的场景,例如社交应用,大型网站等。这些系统的数据量很大,并且增长较快,数据库并发访问量很高。传统的做法是使用分库表中间件,但是中间件对应用的开发有较高的要求,而且有比较多的使用限制。而TaurusDB本身就支持128TB的容量,在使用上和MySQL也没有任何区别,不需要客户自己做分库分表。另外,对性能和数据可靠性上有较高要求的业务,TaurusDB也是一个很好的选择。

升华:探索技术高峰,赋能行业发展
现在的企业都在走向信息化、互联网化,既要保存海量数据,还要使用和分析这些海量数据,那么未来OLTP和OLAP的混合型数据库也是一个重要的发展趋势,客户能够在一个数据库上快速完成交易和分析业务。未来云上的分布式数据库,计算存储分离是一个大趋势,在此架构之下,可以做很多的优化和提供更多的新功能。

现在TaurusDB产品即将公测上线,明年正式对外商用。华为云数据库专家表示,在接下来的产品研发中,会结合华为硬件优势,软硬件结合,进一步优化和提升性能。同时基于计算存储分离的架构,在多写、HTAP、算子下推等方面做进一步的研发。

不仅如此,华为云也将同步更新社区,让用户同时享受商业级的技术服务和开源软件的生态红利。华为云数据库专家表示,现在的MySQL用户可以零门槛地切换到TaurusDB,只要对SQL有所了解,就能操作TaurusDB。华为云数据库团队还在今年组织了TaurusDB性能挑战赛,希望吸引更多开发者关注TaurusDB产品,使其能够在不同的场景下产生价值。
————————————————

原文链接:https://blog.csdn.net/sch881226/article/details/103324306

Python3 基础语法

Python3 基础语法

文章目录
Python3 基础语法
1.注释
2.行与缩进
3.多行语句
4.数字(Number)类型
5.字符串(String)
6.List(列表)
7.Tuple(元组)
7.Set(集合)
8.Dictionary(字典)
Python3 基础语法
1.注释
可以用多个 # 号,还有 ‘’’ 和 “””:

# *个注释
# 第二个注释
”’
第三注释
第四注释
”’

2.行与缩进
使用缩进代替大括号 {} ,同一个代码块,必须包含相同的缩进空格数。否则,会导致运行错误。

if True:
print (“True”)
else:
print (“False”)

3.多行语句
Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠()来实现多行语句,例如:

total = item_one + \
item_two + \
item_three

在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(),例如:

total = [‘item_one’, ‘item_two’, ‘item_three’,
‘item_four’, ‘item_five’]

4.数字(Number)类型
python中数字有四种类型:整数、布尔型、浮点数和复数。

float (浮点数), 如 1.23、3E-2
complex (复数), 如 1 + 2j、 1.1 + 2.2j

在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(),例如:

total = [‘item_one’, ‘item_two’, ‘item_three’,
‘item_four’, ‘item_five’]

数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数。
>>> 2 / 4 # 除法,得到一个浮点数
0.5
>>> 2 // 4 # 除法,得到一个整数
0
>>> 17 % 3 # 取余
2
>>> 2 ** 5 # 乘方
32

5.字符串(String)
1.字符串用单引号 ‘ 或双引号 ” 括起来, ‘’,”“使用完全相同。同时使用反斜杠 \ 转义特殊字符。 2. 三引号(”’或”””)——多行字符串。
索引值以 0 为开始值,-1 为从末尾的开始位置。

word = ‘字符串’
sentence = “这是一个句子。”
paragraph = “””这是一个段落,
可以由多行组成”””

反斜杠()可以作为续行符。在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(),例如:

total = [‘item_one’, ‘item_two’, ‘item_three’,
‘item_four’, ‘item_five’]

6.List(列表)
支持数字,字符串甚至可以包含列表(所谓嵌套)
注意:
1、List写在方括号之间,元素用逗号隔开。
2、和字符串一样,list可以被索引和切片。
3、List可以使用+操作符进行拼接。
4、List中的元素是可以改变的。

>>> a = [1, 2, 3, 4, 5, 6]
>>> a[0] = 9
>>> a[2:5] = [13, 14, 15]
>>> a
[9, 2, 13, 14, 15, 6]
>>> a[2:5] = [] # 将对应的元素值设置为 []
>>> a
[9, 2, 6]

7.Tuple(元组)
元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开。

构造包含 0 个或 1 个元素的元组比较特殊,所以有一些额外的语法规则:
tup1 = () # 空元组
tup2 = (20,) # 一个元素,需要在元素后添加逗号
1
2
3
7.Set(集合)
基本功能是进行成员关系测试和删除重复元素。
使用 { } 或者 set() 函数创建,注意:空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
创建格式:

`parame = {value01,value02,…}
或者
set(value)`

sites = {‘Google’, ‘Taobao’, ‘Runoob’, ‘Facebook’, ‘Zhihu’, ‘Baidu’}

print(sites) # 输出集合,重复的元素被自动去掉

# 成员测试
if ‘Runoob’ in sites :
print(‘Runoob 在集合中’)
else :
print(‘Runoob 不在集合中’)

# set可以进行集合运算
a = set(‘abracadabra’)
b = set(‘alacazam’)

print(a)

print(a – b) # a 和 b 的差集

print(a | b) # a 和 b 的并集

print(a & b) # a 和 b 的交集

print(a ^ b) # a 和 b 中不同时存在的元素

8.Dictionary(字典)
字典用 { } ,是一个无序的 键(key) : 值(value) 的集合。

dict = {}
dict[‘one’] = “1 – 菜鸟教程”
dict[2] = “2 – 菜鸟工具”

tinydict = {‘name’: ‘runoob’,’code’:1, ‘site’: ‘www.runoob.com’}

print (dict[‘one’]) # 输出键为 ‘one’ 的值
print (dict[2]) # 输出键为 2 的值
print (tinydict) # 输出完整的字典
print (tinydict.keys()) # 输出所有键
print (tinydict.values()) # 输出所有值

以上实例输出结果:

1 – 菜鸟教程
2 – 菜鸟工具
{‘name’: ‘runoob’, ‘code’: 1, ‘site’: ‘www.runoob.com’}
dict_keys([‘name’, ‘code’, ‘site’])
dict_values([‘runoob’, 1, ‘www.runoob.com’])`

构造函数 dict() 可以直接从键值对序列中构建字典如下:

>>> dict([(‘Runoob’, 1), (‘Google’, 2), (‘Taobao’, 3)])
{‘Runoob’: 1, ‘Google’: 2, ‘Taobao’: 3}
>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}
>>> dict(Runoob=1, Google=2, Taobao=3)
{‘Runoob’: 1, ‘Google’: 2, ‘Taobao’: 3}
>>>

GNN流程到GCN流程

聚合、更新、循环
举例:输入一个简单的图结构

GNN

  • 聚合操作
  • 更新操作
  • 循环操作(多层更新操作)
  • 目的

GCN

  • 修改的聚合部分
    • 平均法
    • 平均法存在的问题
    • GCN提出的方法

简单粗暴快速理解GNN
Graph-Unets
GCN中的拉普拉斯矩阵如何归一化?

%title插图%num

举例:输入一个简单的图结构

%title插图%num
GNN
聚合操作
经过一次聚合后:聚合到的信息:
邻 居 信 息 N = a ∗ ( 2 , 2 , 2 , 2 , 2 ) + b ∗ ( 3 , 3 , 3 , 3 , 3 ) + c ∗ ( 4 , 4 , 4 , 4 , 4 ) 邻居信息N = a*(2,2,2,2,2)+b*(3,3,3,3,3)+c*(4,4,4,4,4)
邻居信息N=a∗(2,2,2,2,2)+b∗(3,3,3,3,3)+c∗(4,4,4,4,4)

a 、 b 、 c a、b、c a、b、c :自行设置或进行训练学习。
简单的说:就是将其他相邻节点的信息聚合,作为当前节点信息的一个补足。
更新操作
A的信息  = σ ( W ( ( 1 , 1 , 1 , 1 , 1 ) + α ∗   N ) ) \text { A的信息 }=\sigma\left(\mathrm{W}\left((1,1,1,1,1)+\alpha^{*} \mathrm{~N}\right)\right)
A的信息 =σ(W((1,1,1,1,1)+α

N))

简单地说:将得到的邻居节点信息乘以系数加到当前节点,再乘以学习的权重和激活函数,从而获得聚合后的A的信息(一层GNN后的A的*终信息)。

α \alpha α :自行设置或attention机制选出或进行训练学习。
W W W :模型需要训练的权值参数。
σ \sigma σ :激活函数。
循环操作(多层更新操作)
【n层的GNN可以得到n层的邻居信息】
经过一次聚合后:

A中有B,C,D的信息
B中有A,C的信息
C中有A,B,D,E的信息
D中有A,C的信息
E中有C的信息
那么第二次聚合之后以此类推

以A结点为例,此时A聚合C的时候,C中有上一层聚合到的E的信息,所以这时A获得了二阶邻居E的特征。
目的
通过聚合更新,到*后,我们能够得到每个结点的表达,也就是特征feature,此时:

结点分类就可以直接拿去分类,算loss, 优化前面提到的W
关联预测就*简单的方法两个节点的特征一拼,拿去做分类,一样的算loss, 优化。
归根到底,GNN就是个提取特征的方法! ! ! ! !
黑盒子表示:
输入的是节点特征与图的结构
输出的是包含结构与特征的节点的*终特征
用*终特征去进行分类、预测、回归等操作。
GCN
修改的聚合部分
修改了GNN的聚合部分,提出解决 a 、 b 、 c a、b、c a、b、c值的设定问题。

平均法

%title插图%num

首先:提出将邻居的特征加起来作为特征求和。
之后又需要添加闭环:添加一个自环加上自身的特征。
然后:又将求和的特征平均一下的得到当前节点*终的特征。

平均法存在的问题

 

%title插图%num

马云-我的例子。

GCN提出的方法

 

%title插图%num

A ~ \tilde{A}
A
~
:邻接矩阵A+单位矩阵I(表示邻居的信息加上自己的信息)。
D ~ \tilde{D}
D
~
: A ~ \tilde{A}
A
~
的度矩阵。

%title插图%num

使用了对称归一化的拉普拉斯矩阵方法解决了这个问题。

Python实现自定义队列

Python实现自定义队列

项目中需要读取一个pickle数据文件,pickle文件存储的是按行保存的文本,需要调用编码模型分别对每一条文本进行编码,然后使用numpy数组保存编码后的向量。由于模型每次只能输入一定batch size大小的数据,所以需要对数据继续分割后再输入模型编码向量,可以直接加载整个文件,通过batch size来分割整个文件数组。但是如果文件很大,这样的加载方式可能会导致内存溢出。因此考虑对文件进行单行读取,使用一个队列来接受读取的数据,当读取的行数等于batch size时,就将这个批次的数据送入模型进行编码。

于是自己写了一个简单的队列实现批量数据进入队列,队列满了之后清空队列,但与一般的队列不同,只使用一个index的指针来表示队尾巴,并实时返回队列是否已满(此处可以优化)。

队列代码

class data_queue(object):

def __init__(self,size,init_v = “”):
self.init_v = init_v
self.size = size
self.data = [init_v]*size
self.index = -1
self.isFull = False
self.over_v = init_v

def put(self,value):
self.index += 1
self.data[self.index] = value

if self.index == self.size-1:
self.isFull = True
self.over_v = value

return self.isFull

def pop(self):
if self.index < 0:
raise ValueError(“队列为空不能删除”)

# 从队首删除元素,后面的数据往前移
remain_data = self.data[1:self.index+1]
self.data[self.index] = self.init_v
self.data[:self.index] = remain_data

self.index -= 1

def pop_all(self):
if self.index < 0:
raise ValueError(“队列为空不能删除”)

for i in range(self.index,-1,-1):
self.data[i] = self.init_v
self.index -=1

self.isFull = False

def show_data(self):
print(self.index,self.data)

调用测试代码
#测试队列
data_list = [x*3 for x in “abcdefghijklmn”]
# 初始化队列
ds_q = data_queue(10)
tmp = []
for ele in data_list:
is_full = ds_q.put(ele)
ds_q.show_data()

if ele == “f”*3 or ele == “l”*3:
ds_q.pop()
print(“出队一个元素”)

if is_full:
print(“队列已满,返回队列中的值并清空队列”)
tmp = ds_q.data
ds_q.pop_all()

从调用结果来看,实现了队列的功能,在队列满队时就触发pop_all的操作,将所有的队列元素全部弹出去消费,将整个队列清空。因为我在实际使用时不使用pop单个元素的情况,所以编写出队操作的代码比较简单,直接将队头元素出队,整体移动后面的队列元素。但如果需要频繁出队就需要考虑性能,一般会设置队头指针,出队时对头指针往后移动,只有当队尾指针满队时再整体移动队列元素,或者使用循环队列,这个需要根据自己的需求来编写代码。

#测试结果
0 [‘aaa’, ”, ”, ”, ”, ”, ”, ”, ”, ”]
1 [‘aaa’, ‘bbb’, ”, ”, ”, ”, ”, ”, ”, ”]
2 [‘aaa’, ‘bbb’, ‘ccc’, ”, ”, ”, ”, ”, ”, ”]
3 [‘aaa’, ‘bbb’, ‘ccc’, ‘ddd’, ”, ”, ”, ”, ”, ”]
4 [‘aaa’, ‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ”, ”, ”, ”, ”]
5 [‘aaa’, ‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’, ”, ”, ”, ”]
出队一个元素
5 [‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’, ‘ggg’, ”, ”, ”, ”]
6 [‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’, ‘ggg’, ‘hhh’, ”, ”, ”]
7 [‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’, ‘ggg’, ‘hhh’, ‘iii’, ”, ”]
8 [‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’, ‘ggg’, ‘hhh’, ‘iii’, ‘jjj’, ”]
9 [‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’, ‘ggg’, ‘hhh’, ‘iii’, ‘jjj’, ‘kkk’]
队列已满,返回队列中的值并清空队列
0 [‘lll’, ”, ”, ”, ”, ”, ”, ”, ”, ”]
出队一个元素
0 [‘mmm’, ”, ”, ”, ”, ”, ”, ”, ”, ”]
1 [‘mmm’, ‘nnn’, ”, ”, ”, ”, ”, ”, ”, ”]

多线程与多进程

多线程与多进程

多线程与进程
进程(Process)

是计算机中的程序关于某数据集合上的一次运动活动,是系统进行资源分配
和调度的基本单位,是操作系统结构的基础。

线程(Thread)

有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的*
小单位。线程是进程中的一个实体,是被系统独立调度和分配的基本单位,
一个进程可以包含多个线程,但是线程不能包含多个进程。线程自己不拥有
系统资源,在单个程序中同时运行多个线程完成不同的工作,称为多线程。

线程与进程的区别

线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,
而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计算器
为其执行上下文。

单线程实战

from time import ctime,sleep

def talk():
print(“start talk :%r”%ctime())
sleep(2)

def write():
print(“start write:%r”%ctime())
sleep(3)

if __name__ == ‘__main__’ :
talk()
write()
print(“All end !%r” %ctime())

多线程实战

# -*- coding: utf-8 -*-
from time import sleep,ctime
import threading

# 定义说和写
def talk(content,loop):
for i in range(loop):
print(“start talk:%s %s”%(content,ctime()))
sleep(2)

def write(content,loop):
for i in range(loop):
print(“start write:%s %s”%(content,ctime()))
sleep(3)
# 定义和加载说和写的线程
threads = []

t1 = threading.Thread(target=talk,args=(“hello”,2))
threads.append(t1)

t2 = threading.Thread(target=write,args=(“人生苦短,我用python!”,2))
threads.append(t2)
# 执行多线程
if __name__ == ‘__main__’:
for t in threads:
t.start()
for t in threads:
t.join()
print(“线程全部执行完成!%s”%ctime())

多进程实战

# -*- coding: utf-8 -*-
from time import ctime,sleep
# 导入multiprocessing进程模块
import multiprocessing

# 定义两个方法 说和写
def talk(content,loop):
for i in range(loop):
print(“Tlak: %s %s”%(content,ctime))
sleep(2)

def write(content, loop):
for i in range (loop):
print (“write: %s %s” % (content, ctime))
sleep (3)

# 定义两个进程
process = []
p1 = multiprocessing.Process(target=talk,args=(“hello”,2))
process.append(p1)

p2 = multiprocessing.Process(target=write,args=(“人生苦短,我用python”,2))
process.append(p2)

# 调用进程
if __name__ == “__main”:
for p in process:
p.start()
for p in process:
p.join()
print(“调用进程结束 %s”%ctime())

蓝灯、ghelper 哪个好用呢

撸的 azure 天天得换 ip,流量也不够用。
良心云和套路云的轻量经常坚持不了两天。
现在就用 GHelper,晚上速度很差,youtube 看 720p 能费死劲。
不知道蓝灯怎么样有人用过嘛?
还有啥好的推荐么?

nigulasida 1
nigulasida 2 天前
整个机场,一个月 10 块钱,1080P 都无压力
自己搭建,闲的蛋疼
echo314 2
echo314 2 天前 ❤️ 1
https://github.com/XTLS/Xray-core/releases
EasonC 3
EasonC 2 天前 via iPhone
谷歌有 300?试用,速度无压力,不过只能票 3 个月,过期可以继续注册 /购买谷歌号来再续期 3 个月(再试用),因此就是重复循环票
hunk 4
hunk 2 天前
@nigulasida 目前在用机场,不稳定。求推荐选择靠谱机场的方法,现在的 7 月到期。
zuosiruan 5
zuosiruan 2 天前
自己搭吧,简单到不行。只要一台线路稍微好点 vps 就行。vps 可以看看这里
https://www.pai.ma/
wasdqzxe 6
wasdqzxe 1 天前 via Android
有个机场叫大机场 卧槽那是真他妈良心
maocat 7
maocat 1 天前 ❤️ 1
蓝灯,ghelper 都用过

蓝灯:快的时候飞快,慢的时候亲妈都不认识,经常抽风(抽风严重过一段时间白送了一个月),系统代理很好用,跨平台,价格贵,
ghelper:划水的很舒服,网速较快,很少抽风,但是通过订阅链接解析的系统代理,不好用,网速慢,价格适中

个人评价,就这两个来说,蓝灯适合工作,ghelper 适合划水,看视频
love 8
love 1 天前 ❤️ 2
你需要一个不用操作系统自带网络栈的加了黑科技的工具,比如 https://github.com/tobyxdd/hysteria
或者 kcp 也可以,不过 kcp 几乎是双倍发包太浪费流量,且上限很低似乎到 30mbps 就很难上去,且可能要套 udp2raw 否则会被服务商 qos 。
用了这些黑科技,丢包 50%都能看 1080P 。
用原版 OS 的网络丢包 15%就要跪成 ppt,什么 bbr 都救不了。

PS. 程序员用什么机场啊,有这些工具加 cloudcone 这类一年$15 的便宜 vps,一个月几 T 流量,自己用不了还可以给亲朋好友用不好吗,速度也白天晚上流畅 1080P 。
另外这二年几乎不会封 IP 了,至少我是没被封过。
love 9
love 1 天前
对了,cloudcone 不要直接买,注册个帐号,几乎每月都会给你发便宜套餐,一般 15$-20$年。
除了 cloudcone 还有别的一大堆便宜 vps,完全不需要挑网络什么 cn2 gia 什么统统不要,只求便宜,因为有这些黑科技什么垃圾网络都能救。
ooee2016 10
ooee2016 1 天前
@love #8 刚找了个 19.9/y 的机场,买了一年

ooee2016 1 天前
@love #8 主要是昨天下午买的腾讯轻量香港,晚上就不能用了,怕了~~
happyeveryday 12
happyeveryday 1 天前
@ooee2016 你的用法不对吧
1.现在*稳的就是 2L 发的 xray+xtls 方式,性能已经很不错了
2.*稳的话,你在良心云香港轻量上只做 ZF 到其他附近节点,30mbps 的瞬时速度和 1T 流量应付日常使用绰绰有余了
ooee2016 13
ooee2016 1 天前
@happyeveryday #12 我也觉得有可能是我使用的问题。我下午买的。
用<Shadowsocks Python 版一键安装脚本>装好后。回去 ipad 上连上试了下,可以使用,然后我开 B 站看了半小时就再也连不了了。
gxm123gxm 14
gxm123gxm 1 天前
@ooee2016 这么便宜的吗?可以推荐推荐吗
happyeveryday 15
happyeveryday 1 天前
@ooee2016 用 2L 的方式,不要再用任何 ssr 了

在Android系统上安装linux发行版

Install linux distribution

(Debian/Ubuntu/Kali Linux/Fedora/openSUSE/Gentoo/RootFS/Arch Linux) on Android system

在Android系统上安装linux发行版

(Debian/Ubuntu/Kali Linux/Fedora/openSUSE/Gentoo/RootFS/Arch Linux)

1、所用的手机类型为Samsung Note2 Verizon i605

%title插图%num

2、首先对自己的手机做下清理,将SD卡至少剩余4G以上空间;

3、备份Android手机中重要的文件,如通讯录等,防止因刷机异常造成的机器无法正常启动的问题,俗话说ROOT有风险,刷机需谨慎!

本人之前就有一次因自行安装了一个linux,修改了系统的挂载分区,造成无法正常开机的现象,无奈之下,只有重新刷机,望大家以此为鉴,谨慎行事。

4、做好上述步骤后,保持手机处于联网和电量饱满的状态(一边充电一边联网是*好的);

5、剩下的就是软件的准备工作了,前提是你的手机已经ROOT过了,没有ROOT及安装过SuperSU的手机请自行处理。

6、ROOT完毕后,安装的软件就很简单了,就一个linux deploy软件。

如果你是爱折腾的DIY用户,请自行安装其他的软件(如终端模拟器,SSHelper等等);

7、安装好Linux Deploy软件后,点击那个小企鹅打开软件,找到右下角的那个下载图标,如图;

%title插图%num

进入Linux的属性页面即配置界面:

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

如想退出,请先点击STOP停止服务,然后点击手机的菜单键,在弹出的菜单上,选择Exit退出即可。

桌面的PC电脑也是可以登录到手机的,用PUTTY或其它的ssh登录终端;

%title插图%num

其它的安装文件请自行搜索从百度上下载即可,

也可以从我提供的下载地址免币下载:

http://download.csdn.net/detail/leekwen/8603455

软件包中APK的列表如下:

1、com.arachnoid.sshelper.apk

这个为启动sshd服务的软件,感觉这个是所有的SSHD服务中做的*好的了,

但是存在一个问题,就是手机联网后,DNS没有办法获取到,所以造成ping域名无法解析的问题,ping IP地址不存在问题。

2、com.speedsoftware.rootexplorer.apk

这个你懂的,RE管理器,不赘述;

3、eu.chainfire.supersu.apk

这个你也懂的,超级用户管理软件,不赘述;

4、jackpal.androidterm.apk

这个是Android手机的超级终端或终端模拟器,能进入Android手机内部运行busybox的所有命令;

5、ru.meefik.linuxdeploy.apk

iphone7plus电池容量_iOS13.3越狱工具发布 附越狱教程 iPhone12电池容量将继续提升…

12月11日凌晨,苹果正式推送了iOS 13.3正式版系统更新。而近日,国外越狱工具checkra1n也迎来了0.9.7 beta版本更新,加入了对iOS13.3系统的支持,也就是说iOS13.3也能越狱了。以下是iOS13.3越狱工具checkra1n 0.9.7 beta下载与越狱图文教程。

c7d3b89b40d8dc2bd38dfc98de4f1e56.png

具体来说,checkra1n越狱用具依然是利用A5~A11芯片checkm8中的BootROM漏洞来实现。checkm8漏洞的厉害之处在于,它属于硬件级漏洞,苹果公司无法借助iOS软件更新来修复。

d822f0db0a29fcefb0491317912654dc.png

此前,国外大神还称,借助这个漏洞,iPhone 5s – X  等机型可以实现iOS随意降级,不过iOS随意降级工具至今迟迟还没有发布,可能还存在一些技术问题或者苹果有意阻止吧。

CheckRa1n 0.9 beta 越狱工具支持机型:

  • iPhone:iPhone 5S、iPhone 6、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPhone SE、iPhone 7、iPhone 7 Plus、iPhone 8、iPhone 8 Plus、iPhone X
  • iPad:iPad Air iPad、Air 2 9.7寸、iPad Pro 12.9寸、iPad Pro(*代) 10.5寸、iPad Pro 12.9寸、iPad Pro(第二代)、iPad 第六代 (2018年款)、iPad 第五代 (2017年款)、iPad mini 4、iPad mini 3、iPad mini 2

*新的checkra1n 0.9.7 beta工具添加了对iOS 13.3的支持,支持 iPhone SE/6S~iPhone X之间的所有机型,此外该工具还新增对Apple TV 4K的支持,如果弹出“-20 error”直接忽略即可,以下是工具特性一览。

6bd65dddf5779846a3520b1f8f3250e8.png

尽管越狱对于大部分果粉来说,已没有多大的必要,但对于一些玩机爱好者来说,通过越狱可以比较方便的实现分屏、多开、虚拟定位、修改运营商名称、改微信提示音等功能,仍具备一定的可玩性。

iOS13.3越狱方法步骤:

目前checkra1n 0.9.7 beta暂不支持 Windows 电脑操作,仅支持MacOS(苹果电脑)。首先,下载越狱工具并在 Mac 端上打开,如果提示无法打开,在 Mac 端依次打开“系统偏好设置-安全与隐私里”并信任应用,或者在设置中允许未知来源的应用。

37e4c6c1a00fb8d0b07c7bd86c14c88e.png

将iOS设备连接电脑,之后软件会显示当前设备型号、系统以及 ECID,确认无误后点击 Start 以继续:

d3c354ecdbffb6c0cad178159c44aa5e.png

之后,点击 Next 进入恢复模式,如下图。

32564080cb6b3bc1d439d7970b11da09.png

随后设备将自动进入恢复模式,进入恢复模式后点击右下角 Start 按钮,根据指引手动进入 DFU 模式:

3fb74261cb0862ceb19e780452f09879.png

设备进入 DFU 模式后,工具会自动开始越狱,全程不要断开数据线连接,越狱完成后点击 Done 以结束:

c8372abd869502dcc0f0f165b5cd0482.png

至此 Mac 端的操作全部完成,接下来在 iOS 设备上进行以下操作:

打开桌面的 checkra1n,点击 Cydia 并安装;

83277c0c0cb66f9ba8b53ae6f77b6c96.png

如果安装 Cydia 失败,建议使用“V字头”上网方式再尝试,成功安装 Cydia 后本次越狱完成。

f3c10105ea14b29478dcdfefe25cf0a0.png

注:由于是不完美越狱,重启设备将丢失越狱环境,需要重复以上步骤才能继续越狱。

对于需要下载“checkra1n 0.9.7 beta”越狱工具的小伙伴,可以在“芝麻科技网”公众号后台回复关键词“1216”自动获取(注:目前工具仅支持Mac OS平台,暂不支持Windows系统)。

苹果全力解决5G iPhone续航 iPhone12电池容量将提升

据外媒报道,苹果正在全力解决iPhone 12的续航,由于加入对5G网络的支持,这也是必须要去做的改变。报道中提到,iPhone 12系列将采用高通X55基带,即便他们跟高通一起对这个5G基带做了功耗上的优化,但是更高的功耗还是让他们不得不去做出一些调整,即直接增加电池容量。

a1b66f52cb4d27d0e79fedc0258545a2.png

韩媒的*新报道称,苹果将在2020款iPhone上采用新的电池保护电路,长度(50毫米到26毫米)和厚度(1.8毫米到1毫米)都进一步降低,也就是体积缩小,幅度接近50%,据说实现方式是MOSFET(金属半场效晶体管)和PCB板子合并,不再需要构件壳体。

类似技术方案,ITM公司已经向三星提供,预计S11也会采用,这可能解释了S11 Plus为何传言有着5000mAh的大电池。这也从侧面证实了,苹果要为iPhone 12继续增大电池容量。

据产业链透露的情况看,iPhone 12系列明年的备货量至少是1亿台,如果不是十分有信心,相信供应链出身的库克,是不会做这么激进的事吧。苹果将推出较小的5.4英寸iPhone、6.1英寸屏幕的iPhone和6.7英寸屏幕的iPhone。6.7英寸将是苹果所有手机机型中*大的尺寸。

ec71296555806d617b32dbc4b7837adb.png

对于5.4英寸和6.7英寸版本,其会支持三星Y-OCTA技术,这个技术允许触摸屏电路直接在OLED面板上构建,无需单独的层,从而使显示面板更薄并降低生产成本。

至于6.1英寸版本,苹果将继续使用LCD屏材质,可能是受限于OLED屏的成本和产能。iPhone 12系列内存上也会迎来升级,具体来说就是,iPhone 12配备4GB内存,而iPhone 12 Pro系列都是6GB。

python图像exif信息复制

python图像exif信息复制

图像exif信息copy
以下的函数实现了以单独一张影像的exif信息复制给一个文件夹下的所有其他影像,包括焦距、相机型号经纬度等exif信息。另外关于分辨率、图像大小参数的参数不会改变。

代码如下:
#coding=utf-8
import os
import piexif
def getFileList(dir,Filelist, ext=None):
“””
获取文件夹及其子文件夹中文件列表
输入 dir:文件夹根目录
输入 ext: 扩展名
返回: 文件路径列表
“””
newDir = dir
if os.path.isfile(dir):
if ext is None:
Filelist.append(dir)
else:
if ext in dir[-3:]:
Filelist.append(dir)

elif os.path.isdir(dir):
for s in os.listdir(dir):
newDir=os.path.join(dir,s)
getFileList(newDir, Filelist, ext)

return Filelist

def main():
#exif基准图像
baseline_img=’C:/Users/Administrator/Desktop/****.JPG’
#需修改图像的文件夹
org_img_folder=’C:/Users/Administrator/****’
# 检索文件
imglist = getFileList(org_img_folder, [], ‘JPG’)
print(‘本次执行检索到 ‘+str(len(imglist))+’ 张图像\n’)

for imgpath in imglist:
imgname= os.path.splitext(os.path.basename(imgpath))[0]
# 对每幅图像执行相关操作
piexif.transplant(baseline_img, imgpath)
main()