Monkey

news2024/11/25 22:52:08

文章目录

  • 一、简介
  • 二、原理
    • 2.1 特殊处理
  • 三、命令
    • 3.1 启动
    • 3.2 关闭
  • 四、事件
    • 4.1 触摸事件
    • 4.2 手势事件
    • 4.3 二指缩放事件
    • 4.4 轨迹事件
    • 4.5 屏幕旋转事件
    • 4.6 基本导航事件
    • 4.7 主要导航事件
    • 4.8 系统按键事件
    • 4.9 启动activity事件
    • 4.10 键盘事件
    • 4.11 其他类型事件
  • 五、参数
    • 5.1 常规类参数
      • 5.1.1 帮助参数
      • 5.1.2 日志信息参数
    • 5.2 事件类参数
      • 5.2.1 事件及其百分比
      • 5.2.2 随机数种子
      • 5.2.3 事件间隔
      • 5.2.4 执行脚本
    • 5.3约束类参数
      • 5.3.1 包约束
        • 查看包名的方法
      • 5.3.2 activity类约束
    • 5.4 调试类参数
      • 5.4.1 应用崩溃继续发送事件
      • 5.4.2 超时错误继续发送事件
      • 5.4.3 应用权限错误继续发送事件
  • 六、日志管理
    • 6.1 日志保存
      • 电脑
      • 设备
      • 标准流和错误流分开
      • 路径分隔符
    • 6.2 日志解析
      • 6.2.1 测试命令
      • 6.2.2 伪随机事件流
      • 6.2.3 异常
      • 6.2.4 monkey执行结果
    • 6.3 异常统计

一、简介

monkey是Android系统自带的自动化测试工具,顾名思义,像猴子一样活泼好动

  • jar包在Android文件系统中的存放路径是/system/framework/monkey.jar
  • shell脚本在Android文件系统中的存放路径是/system/bin/monkey

二、原理

用户通过adb命令启动monkey,根据命令行参数的配置,向系统发送伪随机的用户事件流,如按键输入、触摸屏幕、轨迹球滑动、手势输入等,对设备进行稳定性测试

2.1 特殊处理

限定monkey运行在特定的包上,那monkey会检测试图转到其他包的操作,并对其进行阻止
应用程序崩溃或接收到任何失控异常,monkey将停止并报错
应用程序产生了无响应ANR的错误,monkey将停止并报错

三、命令

3.1 启动

adb shell monkey [options] <count>

  • options,可选项,如果不指定,monkey将以无反馈模式启动,将事件任意发送到安装在目标环境中的全部包
  • count,随机事件发送次数,必选项
  • 参数没有顺序要求,但是随机事件数一定要在最后!

在这里插入图片描述

3.2 关闭

adb shell ps,查看所有在运行的进程
adb shell "ps | grep monkey",过滤出monkey进程
adb shell kill pid,杀掉进程

或者,直接关机/重启

四、事件

monkey的随机事件流包含11种,分别是触摸事件、手势事件、二指缩放事件、轨迹事件、屏幕旋转事件、基本导航事件、主要导航事件、系统按键事件、启动activity事件、键盘事件、其他类型事件,通过这11种事件来模拟用户的常规操作

4.1 触摸事件

在屏幕某处按下并抬起的操作,由一组Touch (ACTION_DOWN)和Touch (ACTION_UP)组成,实际操作即点击

--pct-touch PERCENT,percent配置事件百分比,指定多个事件百分比总和不能超过100%,不指定就随机分配

:Sending Touch (ACTION_DOWN): 0:(151.0,41.0)
:Sending Touch (ACTION_UP): 0:(151.58891,39.79087)

4.2 手势事件

在屏幕某处按下、随机移动、抬起的操作,由一个Touch (ACTION_DOWN)、一系列Touch (ACTION_MOVE)、一个Touch (ACTION_UP)组成,实际操作即直线滑动

--pct-motion PERCENT

:Sending Touch (ACTION_DOWN): 0:(40.0,54.0)
:Sending Touch (ACTION_MOVE): 0:(38.04351,47.728962)
:Sending Touch (ACTION_MOVE): 0:(34.583817,46.69073)
:Sending Touch (ACTION_MOVE): 0:(30.476467,44.44947)
:Sending Touch (ACTION_MOVE): 0:(26.356031,38.87899)
:Sending Touch (ACTION_UP): 0:(25.772858,38.108803)

4.3 二指缩放事件

在屏幕上的两处同时按下、并同时移动、再同时抬起的操作,由一个Touch (ACTION_DOWN)、一个Touch (ACTION_POINTER_DOWN 1)、一系列Touch (ACTION_MOVE)、一个Touch (ACTION_POINTER_UP 1)、一个Touch (ACTION_UP)组成,前二模拟二指同时点下,后二模拟二指同时松开,实际操作即放大缩小

--pct-pinchzoom PERCENT

:Sending Touch (ACTION_DOWN): 0:(217.0,1014.0)
:Sending Touch (ACTION_POINTER_DOWN 1): 0:(206.71742,1009.79) 1:(41.0,106.0)
:Sending Touch (ACTION_MOVE): 0:(204.29488,1002.99115) 1:(39.891537,111.084694)
:Sending Touch (ACTION_POINTER_UP 1): 0:(196.70801,1002.6718) 1:(38.83169,116.00593)
:Sending Touch (ACTION_UP): 0:(187.4215,1001.8042)

4.4 轨迹事件

一个或多个随机移动,有时伴随点击的操作(模拟轨迹球),目前的手机几乎没有轨迹球,但轨迹球中包含曲线滑动操作,如果需测试曲线滑动则选用此参数,由一系列Trackball (ACTION_MOVE)组成,实际操作即曲线滑动

--pct-trackball PERCENT

:Sending Trackball (ACTION_MOVE): 0:(2.0,0.0)
:Sending Trackball (ACTION_MOVE): 0:(4.0,-1.0)
:Sending Trackball (ACTION_MOVE): 0:(2.0,-1.0)
:Sending Trackball (ACTION_MOVE): 0:(3.0,-4.0)
:Sending Trackball (ACTION_MOVE): 0:(-3.0,-1.0)
:Sending Trackball (ACTION_MOVE): 0:(-3.0,0.0)
:Sending Trackball (ACTION_MOVE): 0:(-2.0,2.0)
:Sending Trackball (ACTION_MOVE): 0:(-5.0,-5.0)
:Sending Trackball (ACTION_MOVE): 0:(1.0,-5.0)

4.5 屏幕旋转事件

隐藏事件,官方文档没有记录,横屏和竖屏进行切换的操作,由rotation事件组成,degree表示旋转方向(顺时针旋转,0表示90度,1表示180度,2表示270度,3表示360度),实际操作即横竖屏切换

--pct-rotation PERCENT

4.6 基本导航事件

点击方向输入设备的上下左右按键的操作,较少使用到,由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成,实际操作即点击上下左右按键

--pct-nav PERCENT

:Sending Key (ACTION_DOWN): 22    // KEYCODE_DPAD_RIGHT
:Sending Key (ACTION_UP): 22    // KEYCODE_DPAD_RIGHT

4.7 主要导航事件

点击”主要导航“按键的操作,如back、menu等,由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成,实际操作即点击上述按键

--pct-majornav PERCENT

4.8 系统按键事件

点击系统保留使用的按键的操作,如home键、返回键、音量键等,由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成,实际操作即点击上述按键

--pct-syskeys PERCENT

:Sending Key (ACTION_DOWN): 25    // KEYCODE_VOLUME_DOWN
:Sending Key (ACTION_UP): 25    // KEYCODE_VOLUME_DOWN

4.9 启动activity事件

启动系统activity的操作,执行startActivity()方法,由switch操作组成,实际操作即打开某应用的某个界面

--pct-appswitch PERCENT

:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.android.settings/.Settings%24RunningServicesActivity;end
    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.settings/.Settings$RunningServicesActivity } in package com.android.settings

4.10 键盘事件

与键盘相关的操作,如点击输入框、键盘弹起、键盘收回等,实际操作即上述

--pct-flip PERCENT

:Sending Flip keyboardOpen=false
Got IOException performing flipjava.io.FileNotFoundException: /dev/input/event0: open failed: EACCES (Permission denied)
    // Injection Failed

4.11 其他类型事件

除前十种事件外的其他所有事件,由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成

--pct-anyevent PERCENT

:Sending Key (ACTION_DOWN): 241    // KEYCODE_TV_NETWORK
:Sending Key (ACTION_UP): 241    // KEYCODE_TV_NETWORK

五、参数

5.1 常规类参数

包括帮助参数和日志信息参数

5.1.1 帮助参数

用于输出monkey命令使用指导

monkey -h

在这里插入图片描述

5.1.2 日志信息参数

将日志分为3个级别,级别越高,日志信息越详细

monkey -v [-v] ...
-v越多日志越详细,目前最多支持3个

  • -v,level0,仅提供启动提示、测试完成、最终结果等少量信息
  • -v -v,leve1,提供较为详细的日志,包括每个发送到activity的信息
  • -v -v -v,level2,提供更详细的日志,包括测试中选中/未选中的activity信息

5.2 事件类参数

对随机事件进行调控,使其遵照设定运行,如设置事件及其百分比、设置事件生成的随机数种子、设置事件执行的事件间隔

5.2.1 事件及其百分比

事件类型参考事件

monkey --pct- percent

5.2.2 随机数种子

本身执行伪随机事件会默认生成seed值,指定seed就可以重复执行之前的伪随机操作。同样的随机数,会执行同样的随机事件

monkey -s SEED

5.2.3 事件间隔

每个指令间固定的时间间隔,单位是毫秒,不指定的话,monkey将不会延迟

monkey --throttle MILLISEC

5.2.4 执行脚本

monkey -f scriptfile [-f scriptfile] ...

5.3约束类参数

5.3.1 包约束

后接一个或多个包,表示允许访问的包,如果需要访问其他包的activity,相关的包也要指定。如果不指定,默认允许启动系统全部包的activity

monkey -p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...
后面可以接数字,表示操作次数

查看包名的方法

查看所有包名,需要root
adb shell
cd data/data
ls

pm命令,不需要root
adb shell pm list package,获取所有apk对应包名
adb shell pm list package -f,获取所有apk对应包名及路径

需打开某一应用,不需要root
adb shell "dumpsys window | grep mCurrentFocus",获取到当前运行的包名和activity

需打开某一应用,不需要root
adb shell
logcat | grep START

5.3.2 activity类约束

后接一个或多个类,表示允许运行的activity

-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...
后面可以接数字,表示操作次数

5.4 调试类参数

三种情况描述对应特殊处理,设置后就可以忽略掉继续发送事件

5.4.1 应用崩溃继续发送事件

--ignore-crashes

5.4.2 超时错误继续发送事件

ignore-timeouts

5.4.3 应用权限错误继续发送事件

--ignore-security-exceptions

六、日志管理

6.1 日志保存

电脑

adb shell monkey ...... > D:\...\monkey.txt

设备

adb shell
monkey ... > /storage/.../monkey.txt

标准流和错误流分开

adb shell monkey ...1>D:\...\monkey.txt 2>D:\...error.txt

路径分隔符

Unix使用 / 作为路径分隔符,web应用在Unix系统上,所以网络地址都采用 / 作为分隔符

Windows已经使用 / 作为dos命令提示符的参数标志,所有使用 \ 作为分隔符,但是,dos系统已被淘汰,很少使用命令提示符,所以二者可互换,无影响

tips:程序编写时,若以字符串形式保存url,分隔符用 \\ 表示的是转义字符

6.2 日志解析

monkey运行输出的日志一般包含四类信息,测试命令信息、伪随机事件流信息、异常信息、monkey执行结果信息

6.2.1 测试命令

命令指定的参数信息
事件对应,不大确定。。。

# 指令参数 
  bash arg: -s
  bash arg: 400
  bash arg: --throttle
  bash arg: 1000
  bash arg: --pct-touch
  bash arg: 80
  bash arg: --ignore-crashes
  bash arg: --ignore-timeouts
  bash arg: -v
  bash arg: -v
  bash arg: -v
  bash arg: 100000000
# 随机数种子
:Monkey: seed=400 count=100000000
# 包含类别
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
//   + Using main activity com.android.calendar.AllInOneActivity (from package com.android.calendar)
//   + Using main activity com.android.camera.CameraLauncher (from package com.android.camera2)
......
// Selecting main activities from category android.intent.category.MONKEY
//   + Using main activity com.android.launcher3.Launcher (from package com.android.launcher3)
//   + Using main activity com.android.settings.Settings$RunningServicesActivity (from package com.android.settings)
......
// Seeded: 400
// Event percentages:
# 事件0--pct-touch
//   0: 80.0%
# 事件1--pct-motion
//   1: 2.3529413%
# 事件2--pct-pinchzoom
//   2: 0.47058824%
# 事件3--pct-trackball
//   3: 3.5294118%
# 事件4--pct-rotation
//   4: -0.0%
# 事件5--pct-nav
//   5: -0.0%
# 事件6--pct-majornav
//   6: 5.882353%
# 事件7--pct-syskeys
//   7: 3.5294118%
# 事件8--pct-appswitch
//   8: 0.47058824%
# 事件9--pct-flip
//   9: 0.47058824%
# 事件10--pct-anyevent
//   10: 0.23529412%
# 事件11--pct-
//   11: 3.0588236%
// Monkey Version Informations:  
// Build Label: SPRD/sl8541e_1h10wifi5g_32b_Natv/sl8541e_1h10wifi5g_32b:10/QP1A.190711.020/211:userdebug/test-keys
// Build Time: 1675427364000
// Build Type: userdebug
// Build Tags: test-keys
// Build Debugable: true
// Build Changelist: 211
// Monkey Start Time : 85534909; Monkey Start Calendar Time : 2023-02-09 09:38:54.463 

6.2.2 伪随机事件流

顺序输出指定的伪随机事件流

6.2.3 异常

执行过程中遇到错误时,输出对应异常信息

# 异常应用包名和pid
// CRASH: com.android.mms (pid 4650)
# 简要信息
// Short Msg: android.content.ActivityNotFoundException
# 详细信息
// Long Msg: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.android.contacts.action.SHOW_OR_CREATE_CONTACT dat=tel:xxxxxxxxxxxx (has extras) }
# 机型和系统信息
// Build Label: SUNMI/CT621/CT621:11/RKQ1.211210.001/131:userdebug/test-keys
// Build Changelist: 131
// Build Time: 1675008998000
# 详细日志
// android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.android.contacts.action.SHOW_OR_CREATE_CONTACT dat=tel:xxxxxxxxxxxx (has extras) }
// 	at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2073)
// 	at android.app.Instrumentation.execStartActivity(Instrumentation.java:1729)
// 	at android.app.Activity.startActivityForResult(Activity.java:5314)
// 	at android.app.Activity.startActivityForResult(Activity.java:5272)
// 	at android.app.Activity.startActivity(Activity.java:5658)
// 	at android.app.Activity.startActivity(Activity.java:5611)
// 	at android.widget.QuickContactBadge$QueryHandler.onQueryComplete(QuickContactBadge.java:402)
// 	at android.content.AsyncQueryHandler.handleMessage(AsyncQueryHandler.java:344)
// 	at android.os.Handler.dispatchMessage(Handler.java:106)
// 	at android.os.Looper.loop(Looper.java:223)
// 	at android.app.ActivityThread.main(ActivityThread.java:7705)
// 	at java.lang.reflect.Method.invoke(Native Method)
// 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
// 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:952)
// 

6.2.4 monkey执行结果

执行完成后,会输出执行结果信息,包括执行事件数量、旋转角度、丢失事件数量、网络状态、最终执行结果等

# 执行事件数量
Events injected: 20
# 旋转角度
:Sending rotation degree=0, persist=false
# 丢失事件数量
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
# 网络状态
## Network stats: elapsed time=10468ms (0ms mobile, 0ms wifi, 10468ms not connected)
# 最终结果
// Monkey finished
// Monkey End Time : 3369113; Monkey End Calendar Time : 2023-02-09 13:41:43.334 

6.3 异常统计

https://www.cnblogs.com/Chilam007/p/10941092.html

还没看明白bat。。。

http://www.manongjc.com/detail/13-rionjdfiqhbjzrf.html
monkeyrunner

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

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

相关文章

ThreadLocal原理、内存泄漏的验证

文章目录前言正文1、ThreadLocal 的常见使用场景2、从ThreadLocal的源码开始2.1 ThreadLocalMap2.2 ThreadLocalMap的 set 方法2.3 ThreadLocalMap的 remove 方法2.4 ThreadLocal 的 set 方法2.5 ThreadLocal 的 remove 方法3、内存泄漏3.1 内存泄漏的概念3.2 为什么说entry的k…

《唐诗三百首》数据源网络下载

2023年的 元宵之夜&#xff0c;这场以“长安”为主题的音乐会火了&#xff01;在抖音&#xff0c;超过2300万人次观看了直播&#xff0c;在线同赏唐诗与交响乐的融合。许多网友惊呼&#xff0c;上学时那些害怕背诵的诗句&#xff0c;原来还可以有这么美的表达这场近80分钟的音乐…

【dapr】服务调用(Service Invokation) - app id的解析

逻辑图解 上图来自Dapr官网教程&#xff0c;其中Checkout是一个服务&#xff0c;负责生成订单号&#xff0c; Order Processor是另一个服务&#xff0c;负责处理订单。Checkout服务需要调用Order Processor的API&#xff0c; 让Order Processor获取到其生成的订单号并进行处理。…

Chapter4:机器人仿真

ROS1{\rm ROS1}ROS1的基础及应用&#xff0c;基于古月的课&#xff0c;各位可以去看&#xff0c;基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。 ROS{\rm ROS}ROS版本&#xff1a;ROS1{\rm ROS1}ROS1的Melodic{\rm Melodic}Melodic&#xff1b;实际机器人&#xff1a;Ha…

打造安全可信的通信服务,阿里云云通信发布《短信服务安全白皮书》

随着数字化经济的发展&#xff0c;信息保护和数据安全成为企业、个人关注的焦点。近日&#xff0c;阿里云云通信发布《短信服务安全白皮书》&#xff0c;该白皮书包含安全责任共担、安全合规、安全架构三大板块&#xff0c;呈现了阿里云云通信在信息安全保护方面的技术能力、安…

【知识梳理】Go语言核心编程

基础知识 Go语言就是为了解决编程语言对并发支持不友好、编译速度慢、编程复杂这三个问题而诞生的 特点: Go语言选择组合思想,抛弃继承关系通过接口组合,自由组合成新接口,用接口实现层与层之间的解耦语言特性对比: package mainimport "fmt"func main() {fmt…

防灾必看,边滑坡安全预警解决方案

一、行业背景在我国大部分地区经常会有雨季发生&#xff0c;大量的雨水渗透到了土壤内部&#xff0c;长时间饱含雨水的土壤会变得很重而且还会减少与下方岩石之间的摩擦力&#xff0c;顺着山坡这个滑梯滑下去&#xff0c;造成崩塌、滑坡、泥石流等地质灾害。地质灾害每年都是有…

ccs导入工程失败的处理方法

文章目录当导入CCS新工程时出现下述错误怎么办&#xff1f;方法一 从TI官网下载安装包进行安装&#xff0c;下载链接&#xff1a;软件下载完成 安装路径为上面的文件夹点击安装完成后&#xff0c;导入安装路径&#xff0c;并点击Refresh按钮&#xff0c;依据路径进行更新&#…

电磁隔离放大器-模拟信号4-20mA/0-±10mA/0-±10V转0-75mV/0-2.5V/0-20mA信号转换模块

概述&#xff1a;导轨安装DIN11 IPO EM系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要电量隔离测控的行业。该模块内部嵌入了一个高效微功率的电源&#xff0c;…

10条终身受益的Salesforce职业发展建议!

Salesforce这个千亿美金巨兽&#xff0c;在全球范围内有42,000多名员工。作为一家发展迅速的科技公司&#xff0c;一直在招聘各种角色&#xff0c;包括销售、营销、工程师和管理人员等。 据IDC估计&#xff0c;从2016年到2020年&#xff0c;该生态系统创造了190万个工作岗位。…

解读 Java 云原生实践中的内存问题

作者&#xff1a;风敬&#xff08;谢文欣&#xff09; Java 凭借着自身活跃的开源社区和完善的生态优势&#xff0c;在过去的二十几年一直是最受欢迎的编程语言之一。步入云原生时代&#xff0c;蓬勃发展的云原生技术释放云计算红利&#xff0c;推动业务进行云原生化改造&…

电子科技大学人工智能期末复习笔记(四):概率与贝叶斯网络

目录 前言 概率 概率公式 贝叶斯公式 链式条件概率 例题 1. 求联合概率分布/边缘概率分布/条件概率分布 2. 灵活运用贝叶斯公式 概率总结 贝叶斯网络 判断独立性 两个事件独立的判断 条件独立性的判断 假设条件独立的链式法则 ⚠Active / Inactive Paths 判断独…

每个前端都应该掌握的7个代码优化的小技巧

本文将介绍7种JavaScript的优化技巧&#xff0c;这些技巧可以帮助你更好的写出简洁优雅的代码。 1. 字符串的自动匹配&#xff08;Array.includes&#xff09; 在写代码时我们经常会遇到这样的需求&#xff0c;我们需要检查某个字符串是否是符合我们的规定的字符串之一。最常…

MySQL进阶篇之锁(lock)

05、锁 5.1、概述 1、介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据…

[DiceCTF 2023] rRabin

一点点学习别人的WP&#xff0c;这回看到一个大姥(r3kapig)的帖子&#xff0c;DiceCTF第二名&#xff0c;不过有好多东西一时还理解不了&#xff0c;得慢慢来。题目这个题有3个功能&#xff1a;rsa加密功能&#xff0c;p,q,N未知&#xff0c;e17低加密指数解密&#xff0c;不过…

JAVA的垃圾收集器与内存分配策略【一篇文章直接看懂】

内存动态分配和垃圾收集技术是JAVA和C之间最大的区别之一 垃圾收集&#xff08;Garbage Collection&#xff0c;GC&#xff09;只办三件事&#xff1a; 哪些内存需要回收什么时候回收如何回收 对于对象回收的方法 引用计数法&#xff1a; 每处引用时1&#xff0c;引用失效…

软件测试标准流程

软件测试的基本流程大概要经历四个阶段&#xff0c;分别是制定测试计划、测试需求分析、测试用例设计与编写以及测试用例评审。因此软件测试的工作内容&#xff0c;远远没有许多人想象的只是找出bug那么简单。准确的说&#xff0c;从一个项目立项以后&#xff0c;软件测试从业者…

第一章 认识Python

本章目录 一、初识Python 二、Python环境安装 三、Python代码的执行 四、Python集成开发环境 五、Python2.x与Python3.x的区别 六、本章小结 Python代码的编辑和运行方式主要分为两种&#xff1a;交互模式和脚本模式。 在交互模式下&#xff0c; 用户输入Python代码并按…

非常棒的13款3DMax渲染器插件推荐给大家

3Ds Max 可能是具有最多可与其集成的外部渲染引擎的 3D 软件包。 今天我们将看看 13 个最好的 3Ds max 渲染插件&#xff0c;我们将从以下列表开始&#xff1a; 13- Radeon ProRender ProRender 的正式名称为 FireRender&#xff0c;是 AMD 的开源路径追踪器。这个 3ds Max …

Redis的缓存雪崩、击穿、穿透和解决方案

2.5 缓存穿透问题的解决思路 缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的解决方案有两种&#xff1a; 缓存空对象 优点&#xff1a;实现简单&#xff0c;维护…