金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > 编程 > Swarm部署记录,循环引用

Swarm部署记录,循环引用

发布时间:2019-11-06 12:10编辑:编程浏览(120)

     

    不会造成循环引用的block

    图片 1

    之前介绍了Docker集群管理工具-Kubernetes部署记录,下面介绍另一个管理工具Swarm的用法,Swarm是Docker原生的集群管理软件,与Kubernetes比起来比较简单。

    大部分GCD方法

    1 dispatch_async(dispatch_get_main_queue(), ^{
    2     [self doSomething];
    3 });
    

    因为self并没有对GCD的block进行持有,没有形成循环引用。目前我还没碰到使用GCD导致循环引用的场景,如果某种场景self对GCD的block进行了持有,则才有可能造成循环引用。

     

     

    Swarm介绍

    block并不是属性值,而是临时变量

     1 - (void)doSomething {
     2     [self testWithBlock:^{
     3         [self test];
     4     }];
     5 }
     6 
     7 - (void)testWithBlock:(void(^)())block {
     8     block();
     9 }
    10 
    11 - (void)test {
    12     NSLog(@"test");
    13 }
    

    这里因为block只是一个临时变量,self并没有对其持有,所以没有造成循环引用

     

    既然要开始学习Python,那么就首先就得不官网下载个Python,小编使用的是3.6的

    Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用Go语言来完成开发,Swarm0.2版本增加了一个新的策略来调度集群中的容器,使得在可用的节点上传播它们,以及支持更多的Docker命令以及集群驱动。Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息。

    block使用对象被提前释放

    有这种情况,如果不只是ClassA持有了myBlock,ClassB也持有了myBlock。

    图片 2

    当ClassA被someObj对象释放后

    图片 3

    此时,ClassA对象已经被释放,而myBlock还是被ClassB持有,没有释放;如果myBlock这个时被调度,而此时ClassA已经被释放,此时访问的ClassA将是一个nil对象(使用__weak修饰,对象释放时会置为nil),而引发错误。

     

    另一个常见错误使用是,开发者担心循环引用错误(如上所述不会出现循环引用的情况),使用__weak。比如

    1 __weak typeof(self) weakSelf = self;
    2 dispatch_async(dispatch_get_main_queue(), ^{
    3     [weakSelf doSomething];
    4 });
    

    因为将block作为参数传给dispatch_async时,系统会将block拷贝到堆上,而且block会持有block中用到的对象,因为dispatch_async并不知道block中对象会在什么时候被释放,为了确保系统调度执行block中的任务时其对象没有被意外释放掉,dispatch_async必须自己retain一次对象(即self),任务完成后再release对象(即self)。但这里使用__weak,使dispatch_async没有增加self的引用计数,这使得在系统在调度执行block之前,self可能已被销毁,但系统并不知道这个情况,导致block执行时访问已经被释放的self,而达不到预期的结果。

     

    安装教程百度经验里面还是很详细的。

    Docker的Swarm(集群)模式,集成很多工具和特性,比如:跨主机上快速部署服务,服务的快速扩展,集群的管理整合到docker引擎,这意味着可以不可以不使用第三方管理工具。分散设计,声明式的服务模型,可扩展,状态协调处理,多主机网络,分布式的服务发现,负载均衡,滚动更新,安全(通信的加密)等等,下面就来认识下Swarm(对于Swarm管理的详细操作可以参考:)

    注:如果是在MRC模式下,使用__block修饰self,则此时block访问被释放的self,则会导致crash。 

    该场景下的代码

     1 // ClassA.m
     2 - (void)test {
     3     __weak MyClass* weakSelf = self;
     4     double delayInSeconds = 10.0f;
     5     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
     6     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
     7         NSLog(@"%@", weakSelf);
     8     });
     9 }
    10 
    11 // ClassB.m
    12 - (void)doSomething {
    13     NSLog(@"do something");
    14     ClassA *objA = [[ClassA alloc] init];
    15     [objA test];
    16 }
    

    运行结果

    [5988:435396] do something
    [5988:435396] self:(null)
    

    解决方法:

    对于这种场景,就不应该使用__weak来修饰对象,让dispatch_after对self进行持有,保证block执行时self还未被释放。

     

    那么正题开始吧!

    Swarm架构

    block执行过程中对象被释放

    还有一种场景,在block执行开始时self对象还未被释放,而执行过程中,self被释放了,此时访问self时,就会发生错误。

    对于这种场景,应该在block中对 对象使用__strong修饰,使得在block期间对 对象持有,block执行结束后,解除其持有。

    1 - (void)testBlockRetainCycle {
    2     ClassA* objA = [[ClassA alloc] init];
    3     __weak typeof(objA) weakObjA = objA;
    4     self.myBlock = ^() {
    5         __strong typeof(weakObjA) strongWeakObjA = weakObjA;
    6         [strongWeakObjA doSomething];
    7     };
    8     objA.objA = self;
    9 }
    

     

    注:此方法只能保证在block执行期间对象不被释放,如果对象在block执行执行之前已经被释放了,该方法也无效。

     

    参考资料:block的循环引用问题

    图片 4

    Swarm作为一个管理Docker集群的工具,首先需要将其部署起来,可以单独将Swarm部署于一个节点。另外,自然需要一个Docker集群,集群上每一个节点均安装有Docker。具体的Swarm架构图可以参照下图:

     

    图片 5

    两种格式化输出的方式

    第一种是用%操作格式化输出字符串

    代码如下:

    图片 6

     

    运行上面的代码输出的结果:

    图片 7

     

    第二种使用format()方法去格式化输出字符串

    代码直接一行语句搞定

    图片 8

     

    你运行后发现结果还是一样的!

    Swarm架构中最主要的处理部分自然是Swarm节点,Swarm管理的对象自然是Docker Cluster,Docker Cluster由多个Docker Node组成,而负责给Swarm发送请求的是Docker Client。

    Python中类型的转换

    很多初学者在刚开始学习Python的对于数据类型有点弄不清楚,比如:

    • a = 666 这是一个定义a为666,默认是整型
    • B = '666' 这是也直接定义,然后默认是字符串

    在Python中有三个内建的函数可以让我们进行类型转换,他们分别是int(),float()和str()函数

    int()函数接收一个浮点型或者合适的字符串

    比如:int(3.1415)、int('1314')、int('3.1415')

    那么他们的运行结果是不是一样呢?

    图片 9

     

    结果很明显了,int()函数接收一个浮点型或者合适的字符串!

    float() 函数接收一个整数和一个合适的字符串

    比如:float(23),float('3.1415')

    图片 10

     

    str( ) 函数是把一个整型或者浮点型的数变为字符串

    比如:str(1231)、str(3.1415)

    图片 11

     

    那么对于类型的转换了解了么,可以自己动手亲自去试一试呀

    图片 12

     

    Swarm关键概念

    关于列表的一些操作

    例如 age = [1,2,3,4,5,6] #其实这里面也可以放不同类型的数据

    列表是可以更改的,如进行单个元素的添加及删除。 我们后面将会介绍元组,它是不能修改的。

    下面列举一些列表的操作

    • age[2] =13
    • age[-1]=23
    • someage = age[2:4]
    • someage = age[0:5:2]
    • del age[1]
    • age.append('没粉丝的程序狗')

    图片 13

     

    如果有什么不明白的地方可以在下方留下的你疑问哦

     

    1)Swarm
    集群的管理和编排是使用嵌入到docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm
    
    2)Node
    一个节点(node)是已加入到swarm的Docker引擎的实例 当部署应用到集群,你将会提交服务定义到管理节点,接着Manager
    管理节点调度任务到worker节点,manager节点还执行维护集群的状态的编排和群集管理功能,worker节点接收并执行来自
    manager节点的任务。通常,manager节点也可以是worker节点,worker节点会报告当前状态给manager节点
    
    3)服务(Service)
    服务是要在worker节点上要执行任务的定义,它在工作者节点上执行,当你创建服务的时,你需要指定容器镜像
    
    4)任务(Task)
    任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点
    
    --------------------------------------------------------------------------------------------------------
    docker swarm:集群管理,子命令有init, join, leave, update。(docker swarm --help查看帮助)
    docker service:服务创建,子命令有create, inspect, update, remove, tasks。(docker service--help查看帮助)
    docker node:节点管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm。(docker node --help查看帮助)
    
    node是加入到swarm集群中的一个docker引擎实体,可以在一台物理机上运行多个node,node分为:
    manager nodes,也就是管理节点
    worker nodes,也就是工作节点
    
    1)manager node管理节点:执行集群的管理功能,维护集群的状态,选举一个leader节点去执行调度任务。
    2)worker node工作节点:接收和执行任务。参与容器集群负载调度,仅用于承载task。
    3)service服务:一个服务是工作节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。
       service是运行在worker nodes上的task的描述,service的描述包括使用哪个docker 镜像,以及在使用该镜像的容器中执行什么命令。
    4)task任务:一个任务包含了一个容器及其运行的命令。task是service的执行实体,task启动docker容器并在容器中执行任务。
    

    Swarm工作方式

    1)Node

    本文由金沙国际官网发布于编程,转载请注明出处:Swarm部署记录,循环引用

    关键词: