• 关于

    exec介绍

    的搜索结果

回答

有必要; Redis事务使用总结: Redis的事务机制允许同时执行多条指令,它是原子性操作,事务中的命令要么全部执行,要么全部不执行,另外,事务中的所有指令都会被序列化,而且其开始执行过程中,不回被即时过来的指令所打断,其需要经历三个过程,分别为开始事务、命令入队以及执行事务。 · 相关命令 · 如何使用 · 脚本事务 · 遇到问题 · 例子演示 一、相关命令 1、MULTI 该命令用来开启事务,它总是返回ok结果,当其执行之后,客户端可以继续发送任意条数量的指令,这些指令不会立即被执行,而是被放到了队列中,直到EXEC被调用之后,所有命令才会被序列化执行。 2、EXEC 该命令负责触发并执行队列中所有的命令。 NOTE: 如果MULTI开启之后,因为某些原因没有成功执行EXEC,那么事务中所有的命令都不会被执行的。 3、DISCARD 该命令用来刷新事务中所有排队等待执行的指令,它总是返回ok结果,并且将服务连接状态恢复到正常。如果已经使用WATCH,那么其会将释放所有被WATCH的key。 4、WATCH 标记所有指定的key被监控起来,使其在事务中有条件的执行(乐观锁)。 NOTE: A、WATCH使得EXEC命令需要有条件的执行,也就是事务只能在所有被监视的键没有被修改的前提下才能执行。另外,在EXEC被执行之后,所有的WATCH都会被取消。 B、UNWATCH手动取消对所有键的WATCH,如果执行了EXEC或者DISCARD,则不需要手动执行UNWATCH命令。 二、如何使用 Redis原生使用(Redis-cli): 127.0.0.1:6379> multi // 事务开始的动作标志下面即为入队 OK 127.0.0.1:6379> set book-name "Thinking in Java" QUEUED 127.0.0.1:6379> get book-name QUEUED 127.0.0.1:6379> sadd tag "java" "Programming""Thinking" QUEUED 127.0.0.1:6379> smembers tag QUEUED 127.0.0.1:6379> exec // 执行事务 1) OK 2) "Thinking in Java" 3) (integer) 3 4) 1) "Thinking" 2) "Programming" 3) "java" 127.0.0.1:6379> discard // 事务已执行完毕 已经自动取消 (error) ERR DISCARD without MULTI 127.0.0.1:6379> multi OK 127.0.0.1:6379> set book-name "Patterns in Java" QUEUED 127.0.0.1:6379> get book-name QUEUED 127.0.0.1:6379> sadd tag "Java" "Thinking""Programming" QUEUED 127.0.0.1:6379> smembers tag QUEUED 127.0.0.1:6379> discard // 事务未执行 可以刷新队列指令状态 取消执行 OK 127.0.0.1:6379> exec // 事务已经被取消不能再执行 (error) ERR EXEC without MULTI 三、脚本事务 Redis 2.6开始支持了脚本,而该脚本本身就是一种事务机制,所以任何在事务里可以完成的事,在脚本里面也能完成,并且使用脚本更简单些,并且速度也更快。不过因为事务提供了一种即使不使用脚本,也可以避免竞争条件的方法,并且事务本身的实现并不复杂,所以现在的使用也比较多,但不排除日后可能被替代或是占据主要地位的可能。 NOTE: Redis为什么引入两种处理事务的方式?脚本功能是 Redis 2.6 才引入的,而事务功能则在更早之前就存在,所以 Redis 才会同时存在两种处理事务的方法。另外,事务脚本会在后续文章中总结介绍。 四、遇到问题 1、乐观锁实现 举个例子,假设我们需要原子性为某个键加1操作(假设INCR不存在),那么应该是这样的执行语句: SET mykey 1 val = GET mykey val = val + 1 SET mykey ${val} 单个客户端访问操作没有任何问题,如果是多个客户端同时访问mykey,就会产生资源共享访问问题,比如:现在有个两个客户端访问同一个键mykey,那么mykey的可能是2,但是我们期望的值应该是3才对,这个类似于高并发下的sync锁机制,所以我们需要使用WATCH来监控被共享的键mykey,如下: WATCH mykey(可监控多个键) val = GET mykey val = val + 1 MULTI SET mykey ${val} EXEC NOTE: 虽然大多情况下,多个客户端访问操作同一个键的情况很少或没有,但是不能排除这个特殊情况,所以建议在有可能产生键共享的指令中使用WATCH在EXEC执行前对其监管。 2、Redis不支持回滚(Roll Back) Redis的事务不支持回滚,这点不同于关系数据库中的事务,所以它的内部保持了简单且快速的特点。另外,Redis不支持回滚是这样考虑的:Redis事务中命令之所以会失败,是由于错误的编程所造成,通过事务回滚是不能回避这个根本问题。 NOTE: Redis事务中命令执行失败,仍会继续执行后面的执行,在没有特殊干预前提下,直到执行完队列中所有指令为止。 3、使用事务可能遇到的问题 A、事务在执行 EXEC 之前,入队的命令可能会出错,举个例子:命令可能会产生语法错误(参数数量错误,参数名错误等),或者其他更严重的错误,比如内存不足(如果服务器使用maxmemory 设置了最大内存限制的话)。 B、事务在执行 EXEC 之前,举个例子:事务中的命令可能处理了错误类型的键,比如将列表命令用在了字符串键上面等。 对于发生在 EXEC 执行之前的错误,客户端以前的做法是检查命令入队所得的返回值:如果命令入队时返回QUEUED ,那么入队成功;否则,就是入队失败。如果有命令在入队时失败,那么大部分客户端都会停止并取消这个事务。 从 Redis 2.6.5 开始,服务器会对命令入队失败的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事务。 在 Redis 2.6.5 以前, Redis 只执行事务中那些入队成功的命令,而忽略那些入队失败的命令。而新的处理方式则使得在管道技术中包含事务变得简单,因为发送事务和读取事务的回复都只需要和服务器进行一次通讯即可。 至于那些在 EXEC 命令执行之后所产生的错误,并没有对它们进行特别处理: 即使事务中有某个/某些命令在执行时产生了错误, 事务中的其他命令仍然会继续执行。 五、例子演示 connect('127.0.0.1',6379); $result = array(); // 开启事务 $redis->multi(); // 添加指令到队列 $redis->set('book-name','Thinking in PHP!'); $redis->sAdd('tags','PHP','Programming','Thinking'); $bookname = $redis->get('book-name'); $tags = $redis->sMembers('tags'); // 执行事务 $redis->exec(); // 显示结果 echo '书名:'.$bookname.' 标签:'.$tags; ?> 结果: 答案来源于网络

问问小秘 2019-12-02 03:02:33 0 浏览量 回答数 0

回答

有必要; Redis事务使用总结: Redis的事务机制允许同时执行多条指令,它是原子性操作,事务中的命令要么全部执行,要么全部不执行,另外,事务中的所有指令都会被序列化,而且其开始执行过程中,不回被即时过来的指令所打断,其需要经历三个过程,分别为开始事务、命令入队以及执行事务。 ·     相关命令 ·     如何使用 ·     脚本事务 ·     遇到问题 ·     例子演示 一、相关命令 1、MULTI 该命令用来开启事务,它总是返回ok结果,当其执行之后,客户端可以继续发送任意条数量的指令,这些指令不会立即被执行,而是被放到了队列中,直到EXEC被调用之后,所有命令才会被序列化执行。 2、EXEC 该命令负责触发并执行队列中所有的命令。 NOTE: 如果MULTI开启之后,因为某些原因没有成功执行EXEC,那么事务中所有的命令都不会被执行的。 3、DISCARD 该命令用来刷新事务中所有排队等待执行的指令,它总是返回ok结果,并且将服务连接状态恢复到正常。如果已经使用WATCH,那么其会将释放所有被WATCH的key。 4、WATCH 标记所有指定的key被监控起来,使其在事务中有条件的执行(乐观锁)。 NOTE: A、WATCH使得EXEC命令需要有条件的执行,也就是事务只能在所有被监视的键没有被修改的前提下才能执行。另外,在EXEC被执行之后,所有的WATCH都会被取消。 B、UNWATCH手动取消对所有键的WATCH,如果执行了EXEC或者DISCARD,则不需要手动执行UNWATCH命令。 二、如何使用 Redis原生使用(Redis-cli): 127.0.0.1:6379> multi     // 事务开始的动作标志下面即为入队 OK 127.0.0.1:6379> set book-name "Thinking in Java" QUEUED 127.0.0.1:6379> get book-name QUEUED 127.0.0.1:6379> sadd tag "java" "Programming""Thinking" QUEUED 127.0.0.1:6379> smembers tag QUEUED 127.0.0.1:6379> exec     // 执行事务 1) OK 2) "Thinking in Java" 3) (integer) 3 4) 1) "Thinking" 2) "Programming" 3) "java" 127.0.0.1:6379> discard  // 事务已执行完毕 已经自动取消 (error) ERR DISCARD without MULTI 127.0.0.1:6379> multi OK 127.0.0.1:6379> set book-name "Patterns in Java" QUEUED 127.0.0.1:6379> get book-name QUEUED 127.0.0.1:6379> sadd tag "Java" "Thinking""Programming" QUEUED 127.0.0.1:6379> smembers tag QUEUED 127.0.0.1:6379> discard  // 事务未执行 可以刷新队列指令状态 取消执行 OK 127.0.0.1:6379> exec     // 事务已经被取消不能再执行 (error) ERR EXEC without MULTI 三、脚本事务 Redis 2.6开始支持了脚本,而该脚本本身就是一种事务机制,所以任何在事务里可以完成的事,在脚本里面也能完成,并且使用脚本更简单些,并且速度也更快。不过因为事务提供了一种即使不使用脚本,也可以避免竞争条件的方法,并且事务本身的实现并不复杂,所以现在的使用也比较多,但不排除日后可能被替代或是占据主要地位的可能。 NOTE: Redis为什么引入两种处理事务的方式?脚本功能是 Redis 2.6 才引入的,而事务功能则在更早之前就存在,所以 Redis 才会同时存在两种处理事务的方法。另外,事务脚本会在后续文章中总结介绍。 四、遇到问题 1、乐观锁实现 举个例子,假设我们需要原子性为某个键加1操作(假设INCR不存在),那么应该是这样的执行语句: SET mykey 1 val = GET mykey val = val + 1 SET mykey ${val} 单个客户端访问操作没有任何问题,如果是多个客户端同时访问mykey,就会产生资源共享访问问题,比如:现在有个两个客户端访问同一个键mykey,那么mykey的可能是2,但是我们期望的值应该是3才对,这个类似于高并发下的sync锁机制,所以我们需要使用WATCH来监控被共享的键mykey,如下: WATCH mykey(可监控多个键) val = GET mykey val = val + 1 MULTI SET mykey ${val} EXEC NOTE: 虽然大多情况下,多个客户端访问操作同一个键的情况很少或没有,但是不能排除这个特殊情况,所以建议在有可能产生键共享的指令中使用WATCH在EXEC执行前对其监管。 2、Redis不支持回滚(Roll Back) Redis的事务不支持回滚,这点不同于关系数据库中的事务,所以它的内部保持了简单且快速的特点。另外,Redis不支持回滚是这样考虑的:Redis事务中命令之所以会失败,是由于错误的编程所造成,通过事务回滚是不能回避这个根本问题。 NOTE: Redis事务中命令执行失败,仍会继续执行后面的执行,在没有特殊干预前提下,直到执行完队列中所有指令为止。 3、使用事务可能遇到的问题 A、事务在执行 EXEC 之前,入队的命令可能会出错,举个例子:命令可能会产生语法错误(参数数量错误,参数名错误等),或者其他更严重的错误,比如内存不足(如果服务器使用maxmemory 设置了最大内存限制的话)。 B、事务在执行 EXEC 之前,举个例子:事务中的命令可能处理了错误类型的键,比如将列表命令用在了字符串键上面等。 对于发生在 EXEC 执行之前的错误,客户端以前的做法是检查命令入队所得的返回值:如果命令入队时返回QUEUED ,那么入队成功;否则,就是入队失败。如果有命令在入队时失败,那么大部分客户端都会停止并取消这个事务。 从 Redis 2.6.5 开始,服务器会对命令入队失败的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事务。 在 Redis 2.6.5 以前, Redis 只执行事务中那些入队成功的命令,而忽略那些入队失败的命令。而新的处理方式则使得在管道技术中包含事务变得简单,因为发送事务和读取事务的回复都只需要和服务器进行一次通讯即可。 至于那些在 EXEC 命令执行之后所产生的错误,并没有对它们进行特别处理: 即使事务中有某个/某些命令在执行时产生了错误, 事务中的其他命令仍然会继续执行。 五、例子演示 <?php $redis = new \Redis(); $redis->connect('127.0.0.1',6379); $result = array(); // 开启事务 $redis->multi(); // 添加指令到队列 $redis->set('book-name','Thinking in PHP!'); $redis->sAdd('tags','PHP','Programming','Thinking'); $bookname = $redis->get('book-name'); $tags = $redis->sMembers('tags'); // 执行事务 $redis->exec(); // 显示结果 echo '书名:'.$bookname.' 标签:'.$tags; ?> 结果:   答案来源于网络

养狐狸的猫 2019-12-02 02:14:26 0 浏览量 回答数 0

回答

使用Maven模块,IntelliJ IDEA将解决源而不是jar的依赖关系。通过您的设置,可以从jar中解决依赖项。 该.class文件需要在罐子代替的根BOOT-INF,如果你想依靠这个罐子中的其他项目。之所以进入这些类,是BOOT-INF因为您正在使用构建可执行jar的spring-boot-loader应用程序。 本文档介绍了如何解决此问题: 为了与另一个项目共享类,最好的方法是创建一个包含共享类的单独的jar,然后使其成为依赖它们的所有模块的依赖项。 ... <build> ... <plugins> ... <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build> 这将创建两个jar,一个带有后缀exec作为可执行jar,另一个是我们可以包含在其他项目中的更典型的jar。 回答来源:Stack Overflow

montos 2020-03-26 19:23:28 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

1.字符串转义序列转义字符 描述(在行尾时) 续行符\ 反斜杠符号' 单引号" 双引号a 响铃b 退格(Backspace)e 转义000 空n 换行v 纵向制表符t 横向制表符r 回车f 换页oyy 八进制数yy代表的字符,例如:o12代表换行xyy 十进制数yy代表的字符,例如:x0a代表换行other 其它的字符以普通格式输出 2.字符串格式化 3.操作符 一、算术运算符 注意: 双斜杠 // 除法总是向下取整。 从符点数到整数的转换可能会舍入也可能截断,建议使用math.floor()和math.ceil()明确定义的转换。 Python定义pow(0, 0)和0 ** 0等于1。 二、比较运算符 运算符 描述< 小于<= 小于或等于 大于= 大于或等于== 等于 != 不等于is 判断两个标识符是不是引用自一个对象is not 判断两个标识符是不是引用自不同对象注意: 八个比较运算符优先级相同。 Python允许x < y <= z这样的链式比较,它相当于x < y and y <= z。 复数不能进行大小比较,只能比较是否相等。 三、逻辑运算符 运算符 描述 备注x or y if x is false, then y, elsex x andy if x is false, then x, elsey not x if x is false, then True,elseFalse 注意: or是个短路运算符,它只有在第一个运算数为False时才会计算第二个运算数的值。 and也是个短路运算符,它只有在第一个运算数为True时才会计算第二个运算数的值。 not的优先级比其他类型的运算符低,所以not a == b相当于not (a == b),而 a == not b是错误的。 四、位运算符 运算符 描述 备注x | y 按位或运算符 x ^ y 按位异或运算符 x & y 按位与运算符 x << n 左移动运算符 x >> n 右移动运算符 ~x 按位取反运算符 五、赋值运算符 复合赋值运算符与算术运算符是一一对应的: 六、成员运算符 Python提供了成员运算符,测试一个元素是否在一个序列(Sequence)中。 运算符 描述in 如果在指定的序列中找到值返回True,否则返回False。not in 如果在指定的序列中没有找到值返回True,否则返回False。 4.关键字总结 Python中的关键字包括如下: and del from not while as elif global or with assert else if pass yield break except import print class exec in raise continue finally is return def for lambda try你想看看有哪些关键字?OK,打开一个终端,就像这样~ long@zhouyl:~$ pythonPython 2.7.3 (default, Jan 2 2013, 16:53:07) [GCC 4.7.2] on linux2Type "help", "copyright", "credits" or "license" for more information. import keywordkeyword.kwlist ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield'] ============================== 华丽的 正文分隔符 ======================================== 看到这些关键字你还能记得多少?你不妨自己一个一个对照想想它的用法,下面是我总结的,我根据前面的学习笔记将上述关键字分为以下几类: 1.判断、循环 对于Python的循环及判断主要包括这些关键字: if elif else for while break continue and or is not in 这几个关键字在前面介绍 if 语法、while语法、for语法以及and...or语法中已有介绍,下面再一笔带过: 1.1 if 语法 if语法与C语言、shell脚本之下的非常类似,最大的区别就是冒号以及严格的缩进,当然这两点也是Python区别于其他语言的地方: if condition1: do something elif condition2: do another thing else: also do something 1.2 while 语法 Python的while语法区别于C、shell下的while除了冒号及缩进之外,还有一点就是while可以携带一个可选的else语句: while condition: do something else: do something 注:else语句是可选的,但是使用while语句时一定要注意判断语句可以跳出! 1.3 for 语法 与while类似,Python的for循环也包括一个可选的else语句(跳出for循环时执行,但是如果是从break语句跳出则不执行else语句块中的代码!),而且for 加上 关键字in就组成了最常见的列表解析用法(以后会写个专门的博客)。 下面是for的一般用法: for i in range(1,10,2): do something if condition: break else: do something for的列表解析用法: for items in list: print items 1.4 and...or 语法 Python的and/or操作与其他语言不同的是它的返回值是参与判断的两个值之一,所以我们可以通过这个特性来实现Python下的 a ? b : c ! 有C语言基础的知道 “ a ? b : c ! ” 语法是判断 a,如果正确则执行b,否则执行 c! 而Python下我们可以这么用:“ a and b or c ”(此方法中必须保证b必须是True值),python自左向右执行此句,先判断a and b :如果a是True值,a and b语句仍需要执行b,而此时b是True值!所以a and b的值是b,而此时a and b or c就变成了b or c,因b是True值,所以b or c的结果也是b;如果a是False值,a and b语句的结果就是a,此时 a and b or c就转化为a or c,因为此时a是 False值,所以不管c是True 还是Flase,a or c的结果就是c!!!捋通逻辑的话,a and b or c 是不是就是Python下的a ? b : c ! 用法? 1.5 is ,not is 和 is not 是Python下判断同一性的关键字,通常用来判断 是 True 、False或者None(Python下的NULL)! 比如 if alue is True : ... (不记得本节的童鞋罚复习:python 学习笔记 2 -- 判断语句) 2.函数、模块、类 对于Python的函数及模块主要包括这些关键字: from import as def pass lambda return class 那么你还能记得它们么?下面简单介绍一下: 2.1 模块 Python的编程通常大量使用标准库中的模块,使用方法就是使用import 、from以及as 关键字。 比如: import sys # 导入sys模块 from sys import argv # 从sys模块中导入argv ,这个在前面介绍脚本传参数时使用到 import cPickle as p # 将cPickle模块导入并在此将它简单命名为p,此后直接可以使用p替代cPickle模块原名,这个在介绍文件输入输出时的存储器中使用到 2.2 函数 Python中定义函数时使用到def关键字,如果你当前不想写入真实的函数操作,可以使用pass关键字指代不做任何操作: def JustAFunction: pass 当然,在需要给函数返回值时就用到了return关键字,这里简单提一下Python下的函数返回值可以是多个(接收返回值时用相应数量的变量接收!)! 此外Python下有个神奇的Lambda函数,它允许你定义单行的最小函数,这是从Lisp中借用来的,可以用在任何需要函数的地方。比如: g = lambda x : x*2 # 定义一个Lambda函数用来计算参数的2倍并返回! print g(2) # 使用时使用lambda函数返回的变量作为这个函数的函数名,括号中带入相应参数即可! (不记得本节的童鞋罚复习:python 学习笔记 4 -- 函数篇) 3.异常 对于Python的异常主要包括这些关键字: try except finally raise 异常这一节还是比较简单的,将可能出现的异常放在 try: 后面的语句块中,使用except关键字捕获一定的异常并在接下来的语句块中做相应操作,而finally中接的是无论出现什么异常总在执行最后做finally: 后面的语句块(比如关闭文件等必要的操作!) raise关键字是在一定的情况下引发异常,通常结合自定义的异常类型使用。 (不记得本节的童鞋罚复习:python 学习笔记 6 -- 异常处理) 4.其他 上面的三类过后,还剩下这些关键字: print del global with assert yield exec 首先print 在前面的笔记或者任何地方你都能见到,所以还是比较熟悉的,此处就不多介绍了!del 关键字在前面的笔记中已有所涉及,比如删除列表中的某项,我们使用 “ del mylist[0] ” 可能这些剩下来的关键字你比较陌生,所以下面来介绍一下: 4.1.global 关键字 当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的 作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。 eg. ? 1 2 3 4 5 6 7 8 9 10 11 !/usr/bin/python Filename: func_local.py def func(x): print'x is', x x = 2 print'Changed local x to', x x = 50 func(x) print'x is still', x 运行的结果是这样的:? 1 2 3 4 $ python func_local.py x is 50 # 运行func函数时,先打印x的值,此时带的值是作为参数带入的外部定义的50,所以能正常打印 x=50 Changed local x to 2 # 在func函数中将x赋2,并打印 x is still 50 # 运行完func函数,打印x的值,此时x的值仍然是之前赋给的50,而不是func函数中修改过的2,因为在函数中修改的只是函数内的局部变量 那么为什么我们要在这提到局部变量呢?bingo,聪明的你一下就猜到这个global就是用来定义全局变量的。也就是说如果你想要为一个在函数外定义的变量赋值,那么你就得告诉Python这个变量名不是局部的,而是 全局 的。我们使用global语句完成这一功能。没有global语句,是不可能为定义在函数外的变量赋值的。eg.? 1 2 3 4 5 6 7 8 9 10 11 12 !/usr/bin/python Filename: func_global.py def func(): global x print'x is', x x = 2 print'Changed local x to', x x = 50 func() print'Value of x is', x 运行的结果是这样的:? 1 2 3 4 $ python func_global.py x is 50 Changed global x to 2 Value of x is 2 # global语句被用来声明x是全局的——因此,当我们在函数内把值赋给x的时候,这个变化也反映在我们在主块中使用x的值的时候。 你可以使用同一个global语句指定多个全局变量。例如global x, y, z。 4.2.with 关键字 有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。如果不用with语句,打开一个文件并读文件的代码如下:? 1 2 3 file = open("/tmp/foo.txt") data = file.read() file.close() 当然这样直接打开有两个问题:一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。下面是添加上异常处理的版本:? 1 2 3 4 5 file = open("/tmp/foo.txt") try: data = file.read() finally: file.close() 虽然这段代码运行良好,但是太冗余了。这时候就是with一展身手的时候了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码:? 1 2 with open("/tmp/foo.txt") as file: data = file.read() 这看起来充满魔法,但不仅仅是魔法,Python对with的处理还很聪明。基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。with语句的执行逻辑如下:紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。 下面例子可以具体说明with如何工作:? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 !/usr/bin/python with_example01.py classSample: def __enter__(self): print"In __enter__()" return"Foo" def __exit__(self, type, value, trace): print"In __exit__()" def get_sample(): returnSample() with get_sample() as sample: print"sample:", sample 运行代码,输出如下? 1 2 3 4 $python with_example01.py In __enter__() # __enter__()方法被执行 sample: Foo # __enter__()方法返回的值 - 这个例子中是"Foo",赋值给变量'sample',执行代码块,打印变量"sample"的值为"Foo" In __exit__() # __exit__()方法被调用 4.3.assert 关键字 assert语句是一种插入调试断点到程序的一种便捷的方式。assert语句用来声明某个条件是真的,当assert语句失败的时候,会引发一AssertionError,所以结合try...except我们就可以处理这样的异常。 mylist # 此时mylist是有三个元素的列表['a', 'b', 'c']assert len(mylist) is not None # 用assert判断列表不为空,正确无返回assert len(mylist) is None # 用assert判断列表为空 Traceback (most recent call last): File "", line 1, in AssertionError # 引发AssertionError异常 4.4.yield 关键字 我们先看一个示例:? 1 2 3 4 5 6 7 8 def fab(max): n, a, b = 0,0,1 whilen < max: yield b # print b a, b = b, a + b n = n + 1 ''' 使用这个函数:? 1 2 3 4 5 6 7 8 forn in fab(5): ... print n ... 1 1 2 3 5 简单地讲,yield 的作用就是把一个函数变成一个 generator(生成器),带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable(可迭代的)对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。也可以手动调用 fab(5) 的 next() 方法(因为 fab(5) 是一个 generator 对象,该对象具有 next() 方法),这样我们就可以更清楚地看到 fab 的执行流程:? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 f = fab(5) f.next() 1 f.next() 1 f.next() 2 f.next() 3 f.next() 5 f.next() Traceback (most recent call last): File"", line 1, in StopIteration 当函数执行结束时,generator 自动抛出 StopIteration 异常,表示迭代完成。在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。 我们可以得出以下结论:一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。 yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清晰。 注:如果看完此段你还未明白yield,没问题,因为yield是初学者的一个难点,那么你下一步需要做的就是……看一看下面参考资料中给的关于yield的博文! 4.5.exec 关键字 官方文档对于exec的解释: "This statement supports dynamic execution of Python code."也就是说使用exec可以动态执行Python代码(也可以是文件)。? 1 2 3 4 5 6 7 8 9 10 11 12 13 longer = "print "Hello World ,my name is longer"" # 比如说我们定义了一个字符串 longer 'print "Hello World ,my name is longer"' exec(longer) # 使用exec 动态执行字符串中的代码 Hello World ,my name is longer exec(sayhi) # 使用exec直接打开文件名(指定sayhi,sayhi.py以及"sayhi.py"都会报一定的错,但是我觉得直接带sayhi报错非常典型) Traceback (most recent call last): File"", line 1, in TypeError: exec: arg 1must be a string, file, or code object # python IDE报错,提示exec的第一个参 数必须是一个字符串、文件或者一个代码对象 f = file("sayhi.py") # 使用file打开sayhi.py并创建f实例 exec(f) # 使用exec直接运行文件描述符f,运行正常!! Hi,thisis [''] script 上述给的例子比较简单,注意例子中exec语句的用法和eval_r(), execfile()是不一样的. exec是一个关键字(要不然我怎么会在这里介绍呢~~~), 而eval_r()和execfile()则是内建函数。更多关于exec的使用请详看引用资料或者Google之 在需要在字符中使用特殊字符时,python用反斜杠()转义字符。 原始字符串 有时我们并不想让转义字符生效,我们只想显示字符串原来的意思,这就要用r和R来定义原始字符串。如: print r’tr’ 实际输出为“tr”。 转义字符 描述 (在行尾时) 续行符 反斜杠符号 ’ 单引号 ” 双引号 a 响铃 b 退格(Backspace) e 转义 000 空 n 换行 v 纵向制表符 t 横向制表符 r 回车 f 换页 oyy 八进制数yy代表的字符,例如:o12代表换行 xyy 十进制数yy代表的字符,例如:x0a代表换行 other 其它的字符以普通格式输出

xuning715 2019-12-02 01:10:21 0 浏览量 回答数 0

问题

快速入门SQL Server版-存储过程

李沃晟 2019-12-01 21:37:45 457 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 除MySQL 基础版以外,其它类型的实例都支持日志管理,您可以通过控制台或SQL命令查询实例的错误日志和慢日志明细,帮助故障定位分析。但对于SQL Server 2012及以上版本的实例而言,仅能通过SQL命令进行日志管理。本文将介绍通过控制台及SQL命令进行日志管理的方法。 通过控制台或者API管理日志 您可以通过RDS控制台进行MySQL 5.5/5.6/5.7、SQL Server 2008 R2、PostgreSQL和PPAS实例的日志管理。但不同引擎所支持的管理内容不同,请以各控制台的界面为准。 对于MySQL高可用版、金融版实例,您还可以通过控制台或者API DescribeDBInstanceSwitchLog查询实例的主备切换日志。 操作步骤 登录RDS管理控制台。 选择目标实例所在地域。 单击目标实例的ID,进入基本信息页面。 在左侧导航栏中选择日志管理,进入日志管理页面。 在日志管理页面选择查询错误日志、慢日志明细、慢日志统计或者主备切换日志,选择时间范围,单击查询。 查询项 内容 错误日志 记录1个月内数据库中执行错误的SQL语句。 慢日志明细 记录1个月内数据库中执行时间超过1s(可以在参数设置中修改long_query_time参数来设置)的SQL语句,并进行相似语句去重。 该列表中不提供最近两个小时的慢日志,如需查询请通过MySQL库中的slow_log_view表查询。 慢日志统计 对1个月内数据库中执行时间超过1秒(可以在参数设置中修改long_query_time参数来设置)的SQL语句进行统计汇总,给出慢查询日志的分析报告。 主备切换日志 该功能适用于:MySQL高可用版、金融版实例。 通过SQL命令管理日志 SQL Server 2012及以上版本的实例仅支持通过存储过程sp_rds_read_error_logs读取错误日志,使用方法与sp_readerrorlog相同。 示例1: EXEC sp_rds_read_error_logs 示例2: EXEC sp_rds_read_error_logs 0,1 ,'error'

2019-12-01 22:57:11 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 除MySQL 基础版以外,其它类型的实例都支持日志管理,您可以通过控制台或SQL命令查询实例的错误日志和慢日志明细,帮助故障定位分析。但对于SQL Server 2012及以上版本的实例而言,仅能通过SQL命令进行日志管理。本文将介绍通过控制台及SQL命令进行日志管理的方法。 通过控制台或者API管理日志 您可以通过RDS控制台进行MySQL 5.5/5.6/5.7、SQL Server 2008 R2、PostgreSQL和PPAS实例的日志管理。但不同引擎所支持的管理内容不同,请以各控制台的界面为准。 对于MySQL高可用版、金融版实例,您还可以通过控制台或者API DescribeDBInstanceSwitchLog查询实例的主备切换日志。 操作步骤 登录RDS管理控制台。 选择目标实例所在地域。 单击目标实例的ID,进入基本信息页面。 在左侧导航栏中选择日志管理,进入日志管理页面。 在日志管理页面选择查询错误日志、慢日志明细、慢日志统计或者主备切换日志,选择时间范围,单击查询。 查询项 内容 错误日志 记录1个月内数据库中执行错误的SQL语句。 慢日志明细 记录1个月内数据库中执行时间超过1s(可以在参数设置中修改long_query_time参数来设置)的SQL语句,并进行相似语句去重。 该列表中不提供最近两个小时的慢日志,如需查询请通过MySQL库中的slow_log_view表查询。 慢日志统计 对1个月内数据库中执行时间超过1秒(可以在参数设置中修改long_query_time参数来设置)的SQL语句进行统计汇总,给出慢查询日志的分析报告。 主备切换日志 该功能适用于:MySQL高可用版、金融版实例。 通过SQL命令管理日志 SQL Server 2012及以上版本的实例仅支持通过存储过程sp_rds_read_error_logs读取错误日志,使用方法与sp_readerrorlog相同。 示例1: EXEC sp_rds_read_error_logs 示例2: EXEC sp_rds_read_error_logs 0,1 ,'error'

2019-12-01 22:57:11 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 除MySQL 基础版以外,其它类型的实例都支持日志管理,您可以通过控制台或SQL命令查询实例的错误日志和慢日志明细,帮助故障定位分析。但对于SQL Server 2012及以上版本的实例而言,仅能通过SQL命令进行日志管理。本文将介绍通过控制台及SQL命令进行日志管理的方法。 通过控制台或者API管理日志 您可以通过RDS控制台进行MySQL 5.5/5.6/5.7、SQL Server 2008 R2、PostgreSQL和PPAS实例的日志管理。但不同引擎所支持的管理内容不同,请以各控制台的界面为准。 对于MySQL高可用版、金融版实例,您还可以通过控制台或者API DescribeDBInstanceSwitchLog查询实例的主备切换日志。 操作步骤 登录RDS管理控制台。 选择目标实例所在地域。 单击目标实例的ID,进入基本信息页面。 在左侧导航栏中选择日志管理,进入日志管理页面。 在日志管理页面选择查询错误日志、慢日志明细、慢日志统计或者主备切换日志,选择时间范围,单击查询。 查询项 内容 错误日志 记录1个月内数据库中执行错误的SQL语句。 慢日志明细 记录1个月内数据库中执行时间超过1s(可以在参数设置中修改long_query_time参数来设置)的SQL语句,并进行相似语句去重。 该列表中不提供最近两个小时的慢日志,如需查询请通过MySQL库中的slow_log_view表查询。 慢日志统计 对1个月内数据库中执行时间超过1秒(可以在参数设置中修改long_query_time参数来设置)的SQL语句进行统计汇总,给出慢查询日志的分析报告。 主备切换日志 该功能适用于:MySQL高可用版、金融版实例。 通过SQL命令管理日志 SQL Server 2012及以上版本的实例仅支持通过存储过程sp_rds_read_error_logs读取错误日志,使用方法与sp_readerrorlog相同。 示例1: EXEC sp_rds_read_error_logs 示例2: EXEC sp_rds_read_error_logs 0,1 ,'error'

2019-12-01 22:57:11 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 除MySQL 基础版以外,其它类型的实例都支持日志管理,您可以通过控制台或SQL命令查询实例的错误日志和慢日志明细,帮助故障定位分析。但对于SQL Server 2012及以上版本的实例而言,仅能通过SQL命令进行日志管理。本文将介绍通过控制台及SQL命令进行日志管理的方法。 通过控制台或者API管理日志 您可以通过RDS控制台进行MySQL 5.5/5.6/5.7、SQL Server 2008 R2、PostgreSQL和PPAS实例的日志管理。但不同引擎所支持的管理内容不同,请以各控制台的界面为准。 对于MySQL高可用版、金融版实例,您还可以通过控制台或者API DescribeDBInstanceSwitchLog查询实例的主备切换日志。 操作步骤 登录RDS管理控制台。 选择目标实例所在地域。 单击目标实例的ID,进入基本信息页面。 在左侧导航栏中选择日志管理,进入日志管理页面。 在日志管理页面选择查询错误日志、慢日志明细、慢日志统计或者主备切换日志,选择时间范围,单击查询。 查询项 内容 错误日志 记录1个月内数据库中执行错误的SQL语句。 慢日志明细 记录1个月内数据库中执行时间超过1s(可以在参数设置中修改long_query_time参数来设置)的SQL语句,并进行相似语句去重。 该列表中不提供最近两个小时的慢日志,如需查询请通过MySQL库中的slow_log_view表查询。 慢日志统计 对1个月内数据库中执行时间超过1秒(可以在参数设置中修改long_query_time参数来设置)的SQL语句进行统计汇总,给出慢查询日志的分析报告。 主备切换日志 该功能适用于:MySQL高可用版、金融版实例。 通过SQL命令管理日志 SQL Server 2012及以上版本的实例仅支持通过存储过程sp_rds_read_error_logs读取错误日志,使用方法与sp_readerrorlog相同。 示例1: EXEC sp_rds_read_error_logs 示例2: EXEC sp_rds_read_error_logs 0,1 ,'error'

2019-12-01 22:57:11 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 除MySQL 基础版以外,其它类型的实例都支持日志管理,您可以通过控制台或SQL命令查询实例的错误日志和慢日志明细,帮助故障定位分析。但对于SQL Server 2012及以上版本的实例而言,仅能通过SQL命令进行日志管理。本文将介绍通过控制台及SQL命令进行日志管理的方法。 通过控制台或者API管理日志 您可以通过RDS控制台进行MySQL 5.5/5.6/5.7、SQL Server 2008 R2、PostgreSQL和PPAS实例的日志管理。但不同引擎所支持的管理内容不同,请以各控制台的界面为准。 对于MySQL高可用版、金融版实例,您还可以通过控制台或者API DescribeDBInstanceSwitchLog查询实例的主备切换日志。 操作步骤 登录RDS管理控制台。 选择目标实例所在地域。 单击目标实例的ID,进入基本信息页面。 在左侧导航栏中选择日志管理,进入日志管理页面。 在日志管理页面选择查询错误日志、慢日志明细、慢日志统计或者主备切换日志,选择时间范围,单击查询。 查询项 内容 错误日志 记录1个月内数据库中执行错误的SQL语句。 慢日志明细 记录1个月内数据库中执行时间超过1s(可以在参数设置中修改long_query_time参数来设置)的SQL语句,并进行相似语句去重。 该列表中不提供最近两个小时的慢日志,如需查询请通过MySQL库中的slow_log_view表查询。 慢日志统计 对1个月内数据库中执行时间超过1秒(可以在参数设置中修改long_query_time参数来设置)的SQL语句进行统计汇总,给出慢查询日志的分析报告。 主备切换日志 该功能适用于:MySQL高可用版、金融版实例。 通过SQL命令管理日志 SQL Server 2012及以上版本的实例仅支持通过存储过程sp_rds_read_error_logs读取错误日志,使用方法与sp_readerrorlog相同。 示例1: EXEC sp_rds_read_error_logs 示例2: EXEC sp_rds_read_error_logs 0,1 ,'error'

2019-12-01 22:57:10 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 除MySQL 基础版以外,其它类型的实例都支持日志管理,您可以通过控制台或SQL命令查询实例的错误日志和慢日志明细,帮助故障定位分析。但对于SQL Server 2012及以上版本的实例而言,仅能通过SQL命令进行日志管理。本文将介绍通过控制台及SQL命令进行日志管理的方法。 通过控制台或者API管理日志 您可以通过RDS控制台进行MySQL 5.5/5.6/5.7、SQL Server 2008 R2、PostgreSQL和PPAS实例的日志管理。但不同引擎所支持的管理内容不同,请以各控制台的界面为准。 对于MySQL高可用版、金融版实例,您还可以通过控制台或者API DescribeDBInstanceSwitchLog查询实例的主备切换日志。 操作步骤 登录RDS管理控制台。 选择目标实例所在地域。 单击目标实例的ID,进入基本信息页面。 在左侧导航栏中选择日志管理,进入日志管理页面。 在日志管理页面选择查询错误日志、慢日志明细、慢日志统计或者主备切换日志,选择时间范围,单击查询。 查询项 内容 错误日志 记录1个月内数据库中执行错误的SQL语句。 慢日志明细 记录1个月内数据库中执行时间超过1s(可以在参数设置中修改long_query_time参数来设置)的SQL语句,并进行相似语句去重。 该列表中不提供最近两个小时的慢日志,如需查询请通过MySQL库中的slow_log_view表查询。 慢日志统计 对1个月内数据库中执行时间超过1秒(可以在参数设置中修改long_query_time参数来设置)的SQL语句进行统计汇总,给出慢查询日志的分析报告。 主备切换日志 该功能适用于:MySQL高可用版、金融版实例。 通过SQL命令管理日志 SQL Server 2012及以上版本的实例仅支持通过存储过程sp_rds_read_error_logs读取错误日志,使用方法与sp_readerrorlog相同。 示例1: EXEC sp_rds_read_error_logs 示例2: EXEC sp_rds_read_error_logs 0,1 ,'error'

2019-12-01 22:57:12 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 除MySQL 基础版以外,其它类型的实例都支持日志管理,您可以通过控制台或SQL命令查询实例的错误日志和慢日志明细,帮助故障定位分析。但对于SQL Server 2012及以上版本的实例而言,仅能通过SQL命令进行日志管理。本文将介绍通过控制台及SQL命令进行日志管理的方法。 通过控制台或者API管理日志 您可以通过RDS控制台进行MySQL 5.5/5.6/5.7、SQL Server 2008 R2、PostgreSQL和PPAS实例的日志管理。但不同引擎所支持的管理内容不同,请以各控制台的界面为准。 对于MySQL高可用版、金融版实例,您还可以通过控制台或者API DescribeDBInstanceSwitchLog查询实例的主备切换日志。 操作步骤 登录RDS管理控制台。 选择目标实例所在地域。 单击目标实例的ID,进入基本信息页面。 在左侧导航栏中选择日志管理,进入日志管理页面。 在日志管理页面选择查询错误日志、慢日志明细、慢日志统计或者主备切换日志,选择时间范围,单击查询。 查询项 内容 错误日志 记录1个月内数据库中执行错误的SQL语句。 慢日志明细 记录1个月内数据库中执行时间超过1s(可以在参数设置中修改long_query_time参数来设置)的SQL语句,并进行相似语句去重。 该列表中不提供最近两个小时的慢日志,如需查询请通过MySQL库中的slow_log_view表查询。 慢日志统计 对1个月内数据库中执行时间超过1秒(可以在参数设置中修改long_query_time参数来设置)的SQL语句进行统计汇总,给出慢查询日志的分析报告。 主备切换日志 该功能适用于:MySQL高可用版、金融版实例。 通过SQL命令管理日志 SQL Server 2012及以上版本的实例仅支持通过存储过程sp_rds_read_error_logs读取错误日志,使用方法与sp_readerrorlog相同。 示例1: EXEC sp_rds_read_error_logs 示例2: EXEC sp_rds_read_error_logs 0,1 ,'error'

2019-12-01 22:57:11 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 除MySQL 基础版以外,其它类型的实例都支持日志管理,您可以通过控制台或SQL命令查询实例的错误日志和慢日志明细,帮助故障定位分析。但对于SQL Server 2012及以上版本的实例而言,仅能通过SQL命令进行日志管理。本文将介绍通过控制台及SQL命令进行日志管理的方法。 通过控制台或者API管理日志 您可以通过RDS控制台进行MySQL 5.5/5.6/5.7、SQL Server 2008 R2、PostgreSQL和PPAS实例的日志管理。但不同引擎所支持的管理内容不同,请以各控制台的界面为准。 对于MySQL高可用版、金融版实例,您还可以通过控制台或者API DescribeDBInstanceSwitchLog查询实例的主备切换日志。 操作步骤 登录RDS管理控制台。 选择目标实例所在地域。 单击目标实例的ID,进入基本信息页面。 在左侧导航栏中选择日志管理,进入日志管理页面。 在日志管理页面选择查询错误日志、慢日志明细、慢日志统计或者主备切换日志,选择时间范围,单击查询。 查询项 内容 错误日志 记录1个月内数据库中执行错误的SQL语句。 慢日志明细 记录1个月内数据库中执行时间超过1s(可以在参数设置中修改long_query_time参数来设置)的SQL语句,并进行相似语句去重。 该列表中不提供最近两个小时的慢日志,如需查询请通过MySQL库中的slow_log_view表查询。 慢日志统计 对1个月内数据库中执行时间超过1秒(可以在参数设置中修改long_query_time参数来设置)的SQL语句进行统计汇总,给出慢查询日志的分析报告。 主备切换日志 该功能适用于:MySQL高可用版、金融版实例。 通过SQL命令管理日志 SQL Server 2012及以上版本的实例仅支持通过存储过程sp_rds_read_error_logs读取错误日志,使用方法与sp_readerrorlog相同。 示例1: EXEC sp_rds_read_error_logs 示例2: EXEC sp_rds_read_error_logs 0,1 ,'error'

2019-12-01 22:57:11 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 除MySQL 基础版以外,其它类型的实例都支持日志管理,您可以通过控制台或SQL命令查询实例的错误日志和慢日志明细,帮助故障定位分析。但对于SQL Server 2012及以上版本的实例而言,仅能通过SQL命令进行日志管理。本文将介绍通过控制台及SQL命令进行日志管理的方法。 通过控制台或者API管理日志 您可以通过RDS控制台进行MySQL 5.5/5.6/5.7、SQL Server 2008 R2、PostgreSQL和PPAS实例的日志管理。但不同引擎所支持的管理内容不同,请以各控制台的界面为准。 对于MySQL高可用版、金融版实例,您还可以通过控制台或者API DescribeDBInstanceSwitchLog查询实例的主备切换日志。 操作步骤 登录RDS管理控制台。 选择目标实例所在地域。 单击目标实例的ID,进入基本信息页面。 在左侧导航栏中选择日志管理,进入日志管理页面。 在日志管理页面选择查询错误日志、慢日志明细、慢日志统计或者主备切换日志,选择时间范围,单击查询。 查询项 内容 错误日志 记录1个月内数据库中执行错误的SQL语句。 慢日志明细 记录1个月内数据库中执行时间超过1s(可以在参数设置中修改long_query_time参数来设置)的SQL语句,并进行相似语句去重。 该列表中不提供最近两个小时的慢日志,如需查询请通过MySQL库中的slow_log_view表查询。 慢日志统计 对1个月内数据库中执行时间超过1秒(可以在参数设置中修改long_query_time参数来设置)的SQL语句进行统计汇总,给出慢查询日志的分析报告。 主备切换日志 该功能适用于:MySQL高可用版、金融版实例。 通过SQL命令管理日志 SQL Server 2012及以上版本的实例仅支持通过存储过程sp_rds_read_error_logs读取错误日志,使用方法与sp_readerrorlog相同。 示例1: EXEC sp_rds_read_error_logs 示例2: EXEC sp_rds_read_error_logs 0,1 ,'error'

2019-12-01 22:57:11 0 浏览量 回答数 0

回答

从 VPC 内的 ECS 到开发人员 PC 的网络还需要进行下面的配置才能打通。包含两种方式:打通 OpenVPN 宿主机到开发人员 PC 网络和打通集群内其他机器到开发人员 PC 的网络,下面将分别介绍。 打通 OpenVPN 宿主机到开发人员 PC 网络 执行 docker exec -ti openvpn bash,登录 OpenVPN 容器。 执行 route -n,在 OpenVPN 容器内查询路由规则。 根据3中开发人员 PC 的 IP,获取对应的路由规则中的 IP 地址段。 示例中获取到的 IP 为 192.168.255.6,对应上图中的网段为 192.168.255.0/24,即 Destination 192.168.255.0,子网掩码 255.255.255.0. 在 OpenVPN 容器内执行 docker exec -ti openvpn bash 命令,获取 eth0 网卡的 IP(VPN 容器网关 IP)。 执行 route add -net 192.168.255.0 netmask 255.255.255.0 dev docker0 gw 172.31.254.2 命令,添加宿主机到 VPN 容器的路由规则。 以上一步获取到的 IP 作为网关,将上上步拿到的网段的流量转到 docker0 网卡。 在 VPN 所在宿主机执行 ping 192.168.255.6 命令,测试到开发人员 PC 的网络是否连通。 打通集群内其他机器到开发人员 PC 的网络 登录专有网络管理控制台,增加一条路由规则。详情请参见添加自定义路由条目。 目标网段为开发人员 PC 所在 IP 网段:192.168.255.0/24,下一条地址为安装 OpenVPN 的 ECS。 打开安装了 VPN 的 ECS 的防火墙,执行 iptables -I FORWARD -i eth0 -o docker0 -j ACCEPT 命令,配置 eth0 到 docker0 的流量。 在集群内其他 ECS 执行 ping 命令,测试到本地开发机网络。

保持可爱mmm 2020-03-28 22:54:34 0 浏览量 回答数 0

回答

我都是直接用Runtime.exec方法执行外部一个phantomjs( http://www.oschina.net/p/phantomjs )的js脚本来把网页内容输出到stdout,再从java里读。js脚本如下: varwebpage=require('webpage');varsystem=require('system');varpage=webpage.create();page.open(system.args[1],function(status){if(status==='success'){varcontent=page.evaluate(function(){returndocument.documentElement.outerHTML;});system.stdout.write(content);}phantom.exit();}); 回复 @JasonO:你可以试试在那个if里试试延迟几秒,或者随便模拟点事件之类的我刚试了一下,还是不行呢。不能获取js动态添加html属性之后的html~呜呜谢谢,请问我爬那些html5的游戏也可以吗?这个有现成的工具的吧请问有没有好的工具介绍一下呢 这个很难吧,需要模拟网页的执行webdriver? IE11  

爱吃鱼的程序员 2020-06-09 15:42:19 0 浏览量 回答数 0

回答

本示例创建了一个简单流程,该流程包含一个传递步骤。 背景信息 以下操作是在控制台创建流程,您也可以直接使用 CreateFlow API 创建流程。 操作步骤 登录 Serverless 工作流控制台。 在流程页面,单击创建流程。 create-flow1 在创建流程页面填写流程名称、流程定义,您可以通过可视化流程辅助编写流程定义。 create-flow2 Serverless 工作流控制台为您准备了一个默认的流程定义,以下 YAML 文本定义的流程包含了一个传递步骤(pass1)。流程定义的详细信息,请参见基本介绍。 version: v1 type: flow steps: - type: pass name: pass1 单击下一步。 由于本示例流程没有访问其它云服务(函数计算),因此您也可以暂时不填写流程角色。 create-flow3 单击创建流程。 执行流程 创建流程后,您可以执行流程,并查看流程执行结果。 背景信息 以下操作是在控制台上执行流程和查看流程,您也可以直接使用 StartExecution API 执行流程,DescribeExecution API 查看执行结果。 操作步骤 在流程页面,选择上一步创建的流程,查看有关流程的信息。 list-flows-1 在流程详情页面,单击启动执行。 start-exec-1 在执行名称文本框中输入执行名称,如果不指定服务会默认生成执行名称。 为执行设置流程的输入。 说明 输入必须是 JSON 对象类型。 单击页面上的启动执行,启动一次新的执行。启动执行后页面会自动跳转到执行页面,您可以查看执行结果。

1934890530796658 2020-03-27 00:42:50 0 浏览量 回答数 0

回答

主要为您介绍如何为运行在virtual-kubelet上的Pod配置NTP服务,当用户使用Pod部署应用时,希望pod内运行容器使用用户自己的NTP做时间同步。您可以参考此文档。 前提条件 升级virtual-kubelet到最新版本,升级方式: 阿里云 serverless kubernetes集群:由管理员统一负责升级 阿里云 托管 kubernetes集群:用户更新 阿里云 专有 kubernetes集群:用户更新 阿里云 自建 kubernetes集群:用户更新 Yaml示例 需要在Pod的Annotations中增加k8s.aliyun.com/eci-ntp-server注解,指明需要配置的NTP服务的IP地址。 $ cat set-ntp-pod.yaml apiVersion: v1 kind: Pod metadata: annotations: k8s.aliyun.com/eci-ntp-server: 100.100.5.1 # 设置您的NTP服务器地址 name: set-custom-ntp spec: nodeName: virtual-kubelet containers: - image: centos:latest command: - sleep - "3600" imagePullPolicy: IfNotPresent name: centos 创建Pod: $ kubectl apply -f set-ntp-pod.yaml 验证 登陆到容器,验证NTP服务是否设置成功。 $ kubectl get pod/set-custom-ntp NAME READY STATUS RESTARTS AGE set-custom-ntp 1/1 Running 0 7m20s kubectl exec set-custom-ntp -it -- bash [root@default-set-custom-ntp /]# chronyc sources 210 Number of sources = 1 MS Name/IP address Stratum Poll Reach LastRx Last sample ^* 100.100.5.1 2 6 377 35 +40us[ +135us] +/- 14ms 100.100.5.1已经在容器中设置成功。

1934890530796658 2020-03-20 17:31:19 0 浏览量 回答数 0

回答

先说一下fork,fork会生成一个和当前进程相同的副本,称为子进程。原进程的所有资源都以适当的方式复制到子进程,因此该系统调用之后,原来的进程就有了两个独立的实例。这两个实例的联系包括:同一组打开文件、同样的工作目录、内存中同样的数据(两个进程各有一份副本)。当然Linux使用了copy on write,也就是说只有新的进程对内存页执行write操作的时候才会复制内存页面。具体如何完成:首先要了解一下task_struct这个数据结构。Linux内核很多涉及进程的部分都围绕这个数据结构(数据结构定义在include/sched.h中,有兴趣去看一下)。数据结构里面的成员非常多,下面会按照几个部分介绍一下。状态和执行信息,如待决信号、使用的二进制格式(和其他系统二进制格式的任何仿真信息)、进程ID号(pid)、到父进程及其他有关进程的指针、优先级和程序执行有关的时间信息(例如CPU时间)。有关已经分配的虚拟内存的信息。进程身份凭据,如用户ID、组ID以及权限等。可使用系统调用查询(或修改)这些数据。使用的文件包含程序代码的二进制文件,以及进程所处理的所有文件的文件系统信息,这些都必须保存下来。线程信息记录该进程特定于CPU的运行时间数据(该结构的其余字段与所使用的硬件无关)。在与其他应用程序协作时所需的进程间通信有关的信息。该进程所用的信号处理程序,用于响应到来的信号。fork之后,操作系统会copy当前进程的task_struct机构体,除了id号不一样之外,其余完全一样。fork之后如果没有调用exec(),那么仅仅只是生成多个当前的进程,提升并发的能力,比如说nginx。nginx的进程都是master进程fork出来的,所以他们有相同的监听句柄。至于是哪个worker进程去响应,nginx有自己的竞争方式。最后关于子进程fork自己会发生什么。请看下图:

a123456678 2019-12-02 02:39:00 0 浏览量 回答数 0

回答

在使用 gRPC(基于 HTTP/2)的 Kubernetes 服务时,到目标的单个连接将在一个 Pod 处终止。如果从客户端发送了多条消息,则所有消息将由该 Pod 处理,从而导致负载不均衡。本文通过示例介绍 gRPC 服务间负载不均衡的问题以及如何实现负载均衡。 背景信息 gRPC是一种基于 HTTP/2 的服务通信协议,使用基于 Protocol Buffers(简称为 PB)格式的服务定义。服务之间调用的数据可以被序列化为较小的二进制格式进行传输。使用 gRPC,可以从 .proto 文件生成多种语言的代码,这也就使得 gRPC 成为了多语言微服务开发的最佳选择之一。 使用基于 HTTP/1.1 的 RPC 时,一个简单的 TCP 负载平衡器足以胜任,因为这些连接都是短暂的,客户端将尝试重新连接,不会保持与运行中的旧 Pod 之间的连接。但是使用基于 HTTP/2 的 gRPC 时,TCP 连接保持打开状态,这样将保持连接到即将失效的 Pod,亦或使集群失去平衡。 gRPC 服务间调用的负载不均衡 通过一个示例了解下 Kubernetes 下的 gRPC 服务间调用的负载不均衡问题。 前提条件 已创建至少一个 Kubernetes 集群。 已设置通过 kubectl 连接该集群,详情参见通过kubectl连接Kubernetes集群。 登录容器服务控制台,在左侧导航栏选择集群 > 命名空间。 在命名空间页面,从集群下拉列表中选择对应的集群。 单击右上方的创建,在创建命名空间窗口,输入命名空间的名称,例如grpc-nosidecar,单击确定。 在命名空间 grpc-nosidecar 下部署 gRPC 服务的服务端 istio-grpc-server。 假设,待创建的描述文件为 istio-grpc-server.yaml,请执行如下命令: kubectl apply -n grpc-nosidecar -f istio-grpc-server.yaml 其中,istio-grpc-server.yaml 文件的内容如下: apiVersion: apps/v1 kind: Deployment metadata: name: istio-grpc-server-v1 labels: app: istio-grpc-server version: v1 spec: replicas: 1 selector: matchLabels: app: istio-grpc-server version: v1 template: metadata: labels: app: istio-grpc-server version: v1 spec: containers: - args: - --address=0.0.0.0:8080 image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-server imagePullPolicy: Always livenessProbe: exec: command: - /bin/grpc_health_probe - -addr=:8080 initialDelaySeconds: 2 name: istio-grpc-server ports: - containerPort: 8080 readinessProbe: exec: command: - /bin/grpc_health_probe - -addr=:8080 initialDelaySeconds: 2 apiVersion: apps/v1 kind: Deployment metadata: name: istio-grpc-server-v2 labels: app: istio-grpc-server version: v2 spec: replicas: 1 selector: matchLabels: app: istio-grpc-server version: v2 template: metadata: labels: app: istio-grpc-server version: v2 spec: containers: - args: - --address=0.0.0.0:8080 image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-server imagePullPolicy: Always livenessProbe: exec: command: - /bin/grpc_health_probe - -addr=:8080 initialDelaySeconds: 2 name: istio-grpc-server ports: - containerPort: 8080 readinessProbe: exec: command: - /bin/grpc_health_probe - -addr=:8080 initialDelaySeconds: 2 apiVersion: v1 kind: Service metadata: name: istio-grpc-server labels: app: istio-grpc-server spec: ports: - name: grpc-backend port: 8080 protocol: TCP selector: app: istio-grpc-server type: ClusterIP 在命名空间 grpc-nosidecar 下部署 gRPC 服务的服务端 istio-grpc-client。 假设,待创建的描述文件为 istio-grpc-client.yaml,请执行如下命令: kubectl apply -n grpc-nosidecar -f istio-grpc-client.yaml 其中,istio-grpc-client.yaml 文件的内容如下: apiVersion: apps/v1 kind: Deployment metadata: name: istio-grpc-client labels: app: istio-grpc-client spec: replicas: 1 selector: matchLabels: app: istio-grpc-client template: metadata: labels: app: istio-grpc-client spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-client imagePullPolicy: Always command: ["/bin/sleep", "3650d"] name: istio-grpc-client apiVersion: v1 kind: Service metadata: name: istio-grpc-client spec: ports: - name: grpc port: 8080 protocol: TCP selector: app: istio-grpc-client type: ClusterIP 执行以下命令,查看 Pod 运行状态: kubectl get pod -n grpc-nosidecar 示例输出如下: NAME READY STATUS RESTARTS AGE istio-grpc-client-dd56bcb45-hvmjt 1/1 Running 0 95m istio-grpc-server-v1-546d9876c4-j2p9r 1/1 Running 0 95m istio-grpc-server-v2-66d9b8847-276bd 1/1 Running 0 95m 执行以下命令,登录到客户端 Pod 容器。 kubectl exec -it -n grpc-nosidecar istio-grpc-client-dd56bcb45-hvmjt sh 进入容器后,执行以下命令: /bin/greeter-client --insecure=true --address=istio-grpc-server:8080 --repeat=100 可以看到所有的请求都指向了一个 Pod: 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 由此可见,从客户端发送了所有消息都由一个 Pod 处理,从而导致负载不均衡。 使用 ASM 实现负载均衡 下面将示例说明如何通过 ASM 实现负载均衡。 前提条件 已创建至少一个服务网格 ASM 实例,并已经添加至少一个集群到该实例中。 已设置通过 kubectl 连接到该集群,详情参见通过kubectl连接Kubernetes集群。 登录容器服务控制台,在左侧导航栏选择集群 > 命名空间。 在命名空间页面,从集群下拉列表中选择对应的集群。 单击右上方的创建,在创建命名空间窗口,输入命名空间的名称,例如grpc-nosidecar,并新增标签istio-injection:enabled,单击确定。 命名空间 grpc-nosidecar 下部署 gRPC 服务的服务端 istio-grpc-server。 假设,待创建的描述文件为 istio-grpc-server.yaml,请执行如下命令: kubectl apply -n grpc-nosidecar -f istio-grpc-server.yaml istio-grpc-server.yaml 文件的内容,参见上文示例。 命名空间 grpc-nosidecar 下部署 gRPC 服务的服务端 istio-grpc-client。 假设,待创建的描述文件为 istio-grpc-client.yaml,请执行如下命令: kubectl apply -n grpc-nosidecar -f istio-grpc-client.yaml istio-grpc-client.yaml 文件的内容,参见上文示例。 执行以下命令,查看 Pod 运行状态: kubectl get pod -n grpc-nosidecar 此时可以看到每个 Pod 中包含了 2 个容器,其中一个容器就是注入的 Sidecar代理,示例输出如下: NAME READY STATUS RESTARTS AGE istio-grpc-client-dd56bcb45-zhfsg 2/2 Running 0 1h15m istio-grpc-server-v1-546d9876c4-tndsm 2/2 Running 0 1h15m istio-grpc-server-v2-66d9b8847-99v62 2/2 Running 0 1h15m 执行以下命令,登录到客户端 Pod 容器。 kubectl exec -it -n grpc-sidecar istio-grpc-client-dd56bcb45-zhfsg sh 进入容器后,执行以下命令: /bin/greeter-client --insecure=true --address=istio-grpc-server:8080 --repeat=100 可以看到所有的请求分别指向了对应的 2 个 Pod,比例接近于50:50,即负载均衡中的 Round-Robin。 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 配置服务网格 ASM 实例的控制平面。 登录 ASM 控制台,进入待配置 服务网格的详情页。 在控制平面区域,选择命名空间页签,创建名为 grpc-sidecar 的命名空间。 选择目标规则页签,在 grpc-sidecar 命名空间下新建目标规则。YAML 文件内容如下: apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: dr-istio-grpc-server spec: host: istio-grpc-server trafficPolicy: loadBalancer: simple: ROUND_ROBIN subsets: - name: v1 labels: version: "v1" - name: v2 labels: version: "v2" 选择虚拟服务页签,在 grpc-sidecar 命名空间下新建虚拟服务。YAML 文件内容如下: apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: vs-istio-grpc-server spec: hosts: - "istio-grpc-server" http: - match: - port: 8080 route: - destination: host: istio-grpc-server subset: v1 weight: 90 - destination: host: istio-grpc-server subset: v2 weight: 10 执行以下命令,登录到客户端 Pod 容器。 kubectl exec -it -n grpc-sidecar istio-grpc-client-dd56bcb45-zhfsg sh 进入容器后,执行以下命令: /bin/greeter-client --insecure=true --address=istio-grpc-server:8080 --repeat=100 可以看到所有的请求分别指向了对应的 2 个 Pod,但比例接近于90:10,并非默认的 Round-Robin。 选择虚拟服务页签,找到 grpc-sidecar 命名空间下名为 vs-istio-grpc-server 的虚拟服务,单击 YAML,调整虚拟服务的权重,以查看调用的不同结果。 修改内容如下: route: - destination: host: istio-grpc-server subset: v1 weight: 0 - destination: host: istio-grpc-server subset: v2 weight: 100 通过 Kubectl 登录容器,执行以下命令: /bin/greeter-client --insecure=true --address=istio-grpc-server:8080 --repeat=100 可以看到所有的请求分别指向了对应的 1 个 Pod,即版本 v2 对应的 Pod。

1934890530796658 2020-03-20 20:17:15 0 浏览量 回答数 0

回答

先说一下fork,fork会生成一个和当前进程相同的副本,称为子进程。原进程的所有资源都以适当的方式复制到子进程,因此该系统调用之后,原来的进程就有了两个独立的实例。这两个实例的联系包括:同一组打开文件、同样的工作目录、内存中同样的数据(两个进程各有一份副本)。当然Linux使用了copy on write,也就是说只有新的进程对内存页执行write操作的时候才会复制内存页面。具体如何完成:首先要了解一下task_struct这个数据结构。Linux内核很多涉及进程的部分都围绕这个数据结构(数据结构定义在include/sched.h中,有兴趣去看一下)。数据结构里面的成员非常多,下面会按照几个部分介绍一下。状态和执行信息,如待决信号、使用的二进制格式(和其他系统二进制格式的任何仿真信息)、进程ID号(pid)、到父进程及其他有关进程的指针、优先级和程序执行有关的时间信息(例如CPU时间)。有关已经分配的虚拟内存的信息。进程身份凭据,如用户ID、组ID以及权限等。可使用系统调用查询(或修改)这些数据。使用的文件包含程序代码的二进制文件,以及进程所处理的所有文件的文件系统信息,这些都必须保存下来。线程信息记录该进程特定于CPU的运行时间数据(该结构的其余字段与所使用的硬件无关)。在与其他应用程序协作时所需的进程间通信有关的信息。该进程所用的信号处理程序,用于响应到来的信号。fork之后,操作系统会copy当前进程的task_struct机构体,除了id号不一样之外,其余完全一样。fork之后如果没有调用exec(),那么仅仅只是生成多个当前的进程,提升并发的能力,比如说nginx。nginx的进程都是master进程fork出来的,所以他们有相同的监听句柄。至于是哪个worker进程去响应,nginx有自己的竞争方式。最后关于子进程fork自己会发生什么。请看下图:linux启动时候只有一个init进程,剩下的题主自行理解。

a123456678 2019-12-02 02:54:52 0 浏览量 回答数 0

问题

Swarm 集群&nbsp;&nbsp;构建管理&nbsp;&nbsp;Dockerfile 支持的指令

青蛙跳 2019-12-01 21:36:56 530 浏览量 回答数 0

回答

云服务器 ECS Linux 服务器由于编码或者特殊字符等问题,可能会导致文件或者目录显示为乱码,并且无法正常删除。 本文介绍通过 inode 对相关文件进行删除的方法。 注意: 请确认相应文件可以删除,或者在操作之前已经进行了有效备份。 删除乱码目录 下面有一个乱码目录,如图:    可以通过如下步骤进行删除: 1. 查看该目录的inode码,命令为 ls -ldi ocs*,如图: 红框中的数字就是该目录的innode码了。 2. 删除该目录,命令为:rm -rf `find ./ -inum 1059660`, 如图: 3. 再次查看这个目录,发现已经删除了。如图:  删除乱码文件 乱码文件如下图所示:   此时使用 rm 命令是输入不了乱码的文件加,复制粘贴也是不可以的: 可以使用查找文件 innode 节点的方式来删除文件。相关步骤如下: 1. 使用 ls -liaha 查看文件的 innode,如下图所示: 2. 可以看到乱码文件的 innode 节点 id 是 525203,之后可以使用 find 命令查找文件删除,命令为: find . -inum id号 -exec rm {} -rf \; 使用 find 命令后,文件便可以删除了。乱码文件夹的删除也可以使用此方法,您可以自行尝试下。   更多信息 删除以 "-" 号开头的文件: 1. 在 Linux 服务器内,有时会创建出一些以参数符号“-”开头来命名的文件,如: 2. 当需要删除这类文件时, 会发现系统会将 “-”  符号认作命令标识,无法正常删除: 3. 此时可以通过如下的命令格式进行删除 rm -- --test rm ./--test 同理创建的方法如下图:  

KB小秘书 2019-12-02 01:29:01 0 浏览量 回答数 0

问题

用户指南-日志管理

李沃晟 2019-12-01 21:39:09 628 浏览量 回答数 0

问题

云服务器 ECS Linux 系统下如何通过 innode 删除乱码的目录

boxti 2019-12-01 22:02:23 1193 浏览量 回答数 0

问题

用户指南-SQL Server链接服务器

李沃晟 2019-12-01 21:39:27 617 浏览量 回答数 0

回答

很多时候如果能构造新的类对象是很有用的。 有个很熟悉的例子是调用 collections.namedtuple() 函数,例如: Stock = collections.namedtuple('Stock', ['name', 'shares', 'price']) Stock <class 'main.Stock'> namedtuple() 使用 exec() 而不是上面介绍的技术。但是,下面通过一个简单的变化, 我们直接创建一个类: import operator import types import sys def named_tuple(classname, fieldnames): # Populate a dictionary of field property accessors cls_dict = { name: property(operator.itemgetter(n)) for n, name in enumerate(fieldnames) } # Make a __new__ function and add to the class dict def __new__(cls, *args): if len(args) != len(fieldnames): raise TypeError('Expected {} arguments'.format(len(fieldnames))) return tuple.__new__(cls, args) cls_dict['__new__'] = __new__ # Make the class cls = types.new_class(classname, (tuple,), {}, lambda ns: ns.update(cls_dict)) # Set the module to that of the caller cls.__module__ = sys._getframe(1).f_globals['__name__'] return cls 这段代码的最后部分使用了一个所谓的”框架魔法”,通过调用 sys._getframe() 来获取调用者的模块名。 另外一个框架魔法例子在2.15小节中有介绍过。 下面的例子演示了前面的代码是如何工作的: Point = named_tuple('Point', ['x', 'y']) Point <class 'main.Point'> p = Point(4, 5) len(p) 2 p.x 4 p.y 5 p.x = 2 Traceback (most recent call last): File " ", line 1, in AttributeError: can't set attribute print('%s %s' % p) 4 5 这项技术一个很重要的方面是它对于元类的正确使用。 你可能像通过直接实例化一个元类来直接创建一个类: Stock = type('Stock', (), cls_dict) 这种方法的问题在于它忽略了一些关键步骤,比如对于元类中 prepare() 方法的调用。 通过使用 types.new_class() ,你可以保证所有的必要初始化步骤都能得到执行。 比如,types.new_class() 第四个参数的回调函数接受 prepare() 方法返回的映射对象。 如果你仅仅只是想执行准备步骤,可以使用 types.prepare_class() 。例如: import types metaclass, kwargs, ns = types.prepare_class('Stock', (), {'metaclass': type}) 它会查找合适的元类并调用它的 prepare() 方法。 然后这个元类保存它的关键字参数,准备命名空间后被返回。

景凌凯 2020-04-17 17:37:39 0 浏览量 回答数 0

回答

PHP的编译并不是很耗时 我之前的文章也介绍过, PHP的编译是线性的编译过程, 不做任何优化, 所以这个过程非常之快. 而编译和执行分离这个特性的提出着认为分离以后, 可以省掉编译过程, 会有很大的性能提升开发速度 PHP的一个优点就是开发/部署/调试非常方案, 更改立即见效, 而如果我们采用了编译/执行分离以后, 那么更改就需要首先编译, 然后部署, 然后才能生效, 这对于开发来说, 并不是什么好事我们有APC/Zend O+等第三方的代码缓存工具 APC等第三方的代码缓存工具(Opcodes Cache)已经相对比较成熟, 并对开发者透明, 大家只要在服务器上安装了APC, 就可以得到编译/执行分离的性能提升. 比如编译/执行分离这个方案是有人在做的, 但是还不成熟等等 要实现编译和执行分离, 其实我们借助APC就能做到, APC提供了一族apc_bin_dump, apc_bin_load函数, 能把Opcodes缓存导出到外部文件中 经过我对apc_bin系列函数的重新梳理, 修复以后, 这部分功能现在终于可以正常工作了, 那么基于这些函数, 我们就可以实现编译执行分离 思路很简单, 在本地通过apc_bin_dumpfile把我们的php文件, 导出成bin文件, 然后在服务器上通过apc_bin_loadfile来读取这些bin文件. 就可以实现编译和执行分离啦, 一个简单的示意代码如下: $ find ./ -name "*.php" -exec php -r "apc_bin_dumpfile(array('{}'), array(), '{}' . '.bin');" \; 然后在服务器端的文件自动加载部分 <?php function __autoload($name) { /*首先计算出文件名字*/ $file = 根据类名得到PHP文件路径(); if (!file_exists($file)) { //文件不存在, 说明我们还没有load过, 那么创建一个空文件. file_put_contents($file, ''); apc_bin_loadfile($file . '.bin'); } else { //我们已经load过了, 理论上应该已经被服务器的APC缓存处理Cache住了. } include ($file); } 当然, 这里只是一个简单的示意, 如果要实际使用, 你还要考虑缓存被换出的可能, 那么一个解决方案就是设置俩个自动加载函数, 第一个如上, 第二个如果被调用, 就说明缓存被换出, 导致include了一个空文件, 于是就再次load一次bin文件就可以了 当然, 你也可以把所有的文件打包到一个bin文件中, 然后只load一次, 后续就交给服务器上的APC Cache来做就可以了. 但是这里有一个要注意的点就是, 那么对于这部分希望代码保护功能的人来说, 就可以使用APC来免费的完成这些事情了. 不过, 这个方案确实有点丑陋, 后续可以考虑在APC上增加直接对bin文件的支持. 

一枚小鲜肉帅哥 2020-05-31 20:56:17 0 浏览量 回答数 0

回答

几谢谢你的耐心解答,虽然没有说什么,。哈哈 这就是不兼容的代价 回复<aclass='referer'target='_blank'>@yak:刚刚看了DarkAngel朋友的回复,看了官网的介绍。自己没有英文的功底,借助百度翻译慢慢的拼接理解大概意思。现在看到了你的回复,方便很多,等下在继续对比一下官网的。理解再深刻一些。早点休息哦。晚安。谢谢呢回复@BJ-CHEN:http://www.zhihu.com/question/19698598你好,请问下能解释一下嘛?我刚入门。谢谢你的耐心解答。早点休息哦这不是PyCharm的问题,是Python3和Python2不兼容的体现。简单来说,Python3不再有raw_input这个内置函数。这种东西看官方文档来得最快,https://docs.python.org/3/whatsnew/3.0.html#builtins,第二条PEP3111可以看到,raw_input在Python3中被重命名为了input。那就是说2.7版本的raw_input=目前3.6的input?谢谢分享呢,刚刚我重新安装一个2.7的版本发现就可以运行了,早点休息哦。我是今天才接触这门语言。谢谢开源社区的朋友耐心的解答。 <divclass="zm-editable-contentclearfix">1.print不再是语句,而是函数,比如原来是print'abc'现在是print('abc') 2.在Python3中,没有旧式类,只有新式类,也就是说不用再像这样classFoobar(object):pass显式地子类化object 3.原来1/2(两个整数相除)结果是0,现在是0.5了 4.新的字符串格式化方法format取代% 5.raw_input重命名为input 6.xrange重命名为range 7.!=取代<> 8.long重命名为int 9.exceptException,e变成except(Exception)ase 10.exec变成函数我用的最多的就是print回复<aclass='referer'target='_blank'>@BJ-CHEN:第一行是为了让python在linux下找到python,第二行是编码问题的明确指示,没有也一般不会影响什么,建议有,尤其是编码问题,win下经常遇到#!/usr/bin/envpython#- -coding:utf-8--你好这两段在mac上还需要添加吗?好像我在2.7和3.6没有添加都没有报错,她是不是被当成注释了呢?

爱吃鱼的程序员 2020-06-08 21:05:57 0 浏览量 回答数 0

问题

redhat5和centos5安装vncserver实现图形化访问

dhjzy868 2019-12-01 20:59:25 16149 浏览量 回答数 14
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站