Other

创建进程,join方法,进程对象相关属性和方法,僵尸进程和孤儿进程,守护进程,互斥锁

创建进程 在python中提供了一个multiprocessing模块可以帮助我们使用多进程解决问题。在multiprocessing 模块中有一个类Process。 from multiprocessing import Process ''' group=None, 为日后开发新功能准备 target=None, 目标任务 name=None, 进程的姓名 args=(), 目标任务需要的位置参数 kwargs={}, 目标任务需要的字典参数 daemon=None):默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置 ''' #方法介绍 p.start()#开启进程,使用run()方法 p.run()#进程启动时运行的方法是它去调用target指定的目标 p.terminate()#强制终止进程,不会进行清理操作 p.is_alive()#判断进程是否存活 p.join([timeout])#让在join方法之后的进程等待,直到p进程运行结束 强调:不同的操作系统创建进程的要求不一样 在windows中创建进程是以导入模块的方式进行 所以创建进程的代码必须写在__main__子代码中 否则会直接报错 因为在无限制创建进程 在linux和mac中创建进程是直接拷贝一份源代码然后执行 不需要写在__main__子代码中 第一种方法 from multiprocessing import Process import time def test(): print('=======>') time.sleep(3) print('=======>') def test1(name): print(f'{name}') time.sleep(3) print('=======>') if __name__ == '__main__': p = Process(target=test) # p = Process(target=test1, args=('春游去动物园',)) p.start() print('主') 第二种方法 from multiprocessing import Process class Test(Process): def __init__(self,name): super().

LeetCode-152-乘积最大子数组

乘积最大子数组 题目描述:给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 示例说明请见LeetCode官网。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-product-subarray/ 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解法一:穷举法 首先,如果数组nums只有一个元素,直接返回这个数。 否则,通过穷举出所有可能的连续子数组的乘积,然后获取较大者,使用result记录最大值,初始化为数组nums的第一个元素值,具体过如下: 从第一个元素开始遍历,作为连续子数组的第一个元素; 然后内层循环是作为连续子数组的最后一个数组,过程中需要判断当前的连续子数组的乘积是否大于result,如果是则更新result的值。 最后,返回result即为最大的乘积。 public class LeetCode_152 { /** * 穷举法 * * @param nums 原数组 * @return 返回数组中乘积最大的连续子数组的乘积 */ public static int maxProduct(int[] nums) { // 如果数组nums只有一个元素,直接返回这个数 if (nums.length == 1) { return nums[0]; } // result记录当期的最大值 int result = nums[0]; // 从数组的nums的第一个元素开始遍历 for (int i = 0; i < nums.length; i++) { int cur = nums[i]; // result取较大值 result = Math.

JAVA---BLOB数据的插入与查询

package java5.blob; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.sql.Blob; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.junit.Test; import java3.bean.Customer; import java3.util.JDBCUtils; /* * 使用preparedStatement操作Blob类型的数据 */ public class BlobTest { //向数据表customers中插入Blob类型的字段 @Test public void testInsert() throws Exception{ Connection conn = JDBCUtils.getConnedtion(); String sql=insert into customers(name,email,birth,photo)values(?,?,?,?); PreparedStatement ps = conn.prepareStatement(sql); ps.setObject(1, lion); ps.setObject(2, [email protected]); ps.setObject(3, 1111-2-3); FileInputStream is = new FileInputStream(new File(2.png)); ps.setBlob(4, is); ps.

k8s入门之pod(四)

pod是k8s项目中的最小编排单位,它是运行中的一组(一个或多个)容器,这些容器共享存储、网络、调度等资源,pod是一个逻辑概念,同一个名称空间下不同pod可以通过ip互相访问。 一、通过命令行方式管理 1.创建 在dev名称空间下创建名称为mynginx的pod,如果不指定-n参数,则默认创建在default名称空间下 kubectl run mynginx --image=nginx -n dev 2.查看dev名称空间下所有pod的简单信息 kubectl get pod -n dev 创建pod需要时间,尤其是节点上没有该镜像时,还需要下载镜像,可以看到pod的Status状态会随着时间而改变,最后变成Running表示pod启动成功 3.查看dev名称空间下所有pod的详细信息 kubectl get pod -n dev -owide --show-labels 结果截图如下 NODE:表示该pod被调度了哪个worker节点上 IP:k8s会为每个pod分配一个ip,集群中的任意一个机器以及任意的应用都能通过此ip来访问这个Pod 在master节点上可以通过curl ip访问pod # 默认是80端口,所以访问的是pod中的nginx容器 curl 10.244.218.1 4.根据标签检索pod kubectl get pod -n dev -owide --show-labels -l app=nginx 5.查看pod的描述信息 kubectl describe pod mynginx -n dev 其中Events事件可以查看到pod被创建的详细过程 6.查看Pod的运行日志 kubectl logs mynginx -n dev 7.进入pod容器 kubectl exec -it mynginx /bin/bash -n dev 更改nginx容器的index.

简单又别致的环形加载动画(HTML+CSS)

简单的环形 HTML代码 <!DOCTYPE html> <html> <head> <meta http-equiv=content-type content=text/html; charset=utf-8> <meta name=viewport content=width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no> <title>简单又别致的环形加载动画</title> <link rel=stylesheet href=huanhuan.css> </head> <body> <div class=loader> <div></div> <div></div> <div></div> <div></div> </div> </body> </html> CSS代码 *{ margin: 0; padding: 0; } body{ /* 100%窗口高度 */ height: 100vh; /* 弹性布局 水平+垂直居中 */ display: flex; justify-content: center; align-items: center; /* 渐变背景 */ background: linear-gradient(15deg,#f7bfd1,#7efbf7); } .loader{ width: 200px; height: 200px; /* 相对定位 */ position: relative; } .loader div{ border-width: 2px; /*border-style: solid;*/ border-style:dotted solid double dashed; border-left-color: #f8c92b; border-right-color: #ff964e; border-top-color: transparent; border-bottom-color: transparent; border-radius: 70%; /* 绝对定位 */ position: absolute; /* 执行动画:动画名 时长 慢速开始然后变快然后慢速结束 无限次播放 */ animation: spin 2s ease infinite; } /* 为每一个圆环设置大小、定位、动画延迟时间 */ .

JAVA---批量插入数据的操作

package java5.blob; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import org.junit.Test; import java3.util.JDBCUtils; /* * 使用PreparedStatement实现批量数据的操作 * update、delete本身就具有批量操作的效果 * 所以主要研究如何用PreparedStatement实现更高效的批量插入 */ public class InsertTest { //批量插入方式二:使用PreparedStatement @Test public void testInsert1() throws Exception{ Connection conn=null; PreparedStatement ps=null; try { long start = System.currentTimeMillis(); conn = JDBCUtils.getConnedtion(); String sql=insert into goods(name)values(?); ps = conn.prepareStatement(sql); for(int i=1;i<=200;i++){ ps.setObject(1, name_+i); ps.execute(); } long end = System.currentTimeMillis(); System.out.println(花费的时间为:+(end-start)); } catch (Exception e) { e.printStackTrace(); } finally{ JDBCUtils.

Java基础09

自增,自减 //++ ,-- 自增 , 自减, 一元运算符 int a= 3;int b=a++;// 执行完这行代码,先给b赋值,再自增//a= a + 1;System.out.println(a);int c=++a;// 执行完这行代码,先自增,再给b赋值// a=a + 1;System.out.println(a);System.out.println(b);System.out.println(c); //幂运算 2*2*2 很多运算 我们会使用一些工具类来操作!! //Math.powdouble pow=Math.pow(2,3);System.out.println(pow); //与(and ), 或(or),非(取反);  boolean a =true; boolean b= false;  System.out.println(a && b:+(a&&b));//逻辑与运算: 两个变量都为真,结果才为true System.out.println(a || b:+(a||b));//逻辑或运算,两个变量有一个为真,结果才为true System.out.println(!(a&&b):+!(a&&b));//如果是真,则变为假,如果是假则为真 //短路运算  int c=5; boolean d=(c<4)&&(c++<4);//c本该等于6的,由于5不小于4所以前半段为false,所以出现短路运算并不会运行后半段 System.out.println(c); System.out.println(d);//位运算符  /* A=0011 1100 B=0000 1101  A&B:0000 1100 //如果两个为1它才为1,否则为0 A|B:0011 1101//都是0则为0,否则就是1 A^B:0011 0001//如果两个位置相同就为0,否则就为1 ~B:1111 0010//取反  2*8=16 2*2*2*2 //效率极高!

目标检测数据集分析

目录目标检测数据集分析图片数量、标注框数量、类别信息所有图片宽度和高度的散点图所有标注框宽度和高度的散点图标注框宽度和高度之比每一类的标注框数量每一类图片数量每一张图片上的标注框数量不同尺寸的图片数量每一类标注框的宽度高度散点图使用方法InstallUsageExample 目标检测数据集分析 平时我们经常需要对我们的数据集进行各种分析,以便我们找到更好的提高方式。所以我将我平时分析数据集的一些方法打包发布在了Github上,分享给大家,有什么错误和意见,请多多指教! 项目地址 图片数量、标注框数量、类别信息 这些信息会在终端打印出来,格式如下: number of images: 6666 number of boxes: 19958 classes = ['4', '2', '1', '3'] 所有图片宽度和高度的散点图 这里只有一个点,是因为所有的图片尺寸相同 所有标注框宽度和高度的散点图 标注框宽度和高度之比 横坐标为比率,纵坐标为数量 每一类的标注框数量 每一类图片数量 每一张图片上的标注框数量 横坐标为一张图片上的标注框数量,纵坐标为图片数量 不同尺寸的图片数量 根据coco的划分规则计算 每一类标注框的宽度高度散点图 使用方法 Github Install git clone https://github.com/Shanyaliux/DataAnalyze.git cd DataAnalyze pip install -r requirements.txt Usage python DataAnalyze.py ${type} ${path} [--out ${out}] type The format of the dataset, optional 'coco' or 'voc'. path The path of dataset.

celery异步任务框架

Celery 一、官方 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/latest/index.html Celery 官方文档中文版:http://docs.jinkan.org/docs/celery/ 二、Celery异步任务框架 1)可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket) 2)celery服务为为其他项目服务提供异步解决任务需求的 注:会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的需求 人是一个独立运行的服务 | 医院也是一个独立运行的服务 正常情况下,人可以完成所有健康情况的动作,不需要医院的参与;但当人生病时,就会被医院接收,解决人生病问题 人生病的处理方案交给医院来解决,所有人不生病时,医院独立运行,人生病时,医院就来解决人生病的需求 Celery架构图 Celery的架构由三部分组成,消息中间件(message broker)、任务执行单元(worker)和 任务执行结果存储(task result store)组成。 消息中间件 Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等等 任务执行单元 Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。 任务结果存储 Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, redis等 三、使用场景 异步执行:解决耗时任务 延迟执行:解决延迟任务 定时执行:解决周期(周期)任务 四、Celery的安装配置 pip install celery 消息中间件:RabbitMQ/Redis app=Celery('任务名', broker='xxx', backend='xxx') 五、两种celery任务结构:提倡用包管理,结构更清晰 # 如果 Celery对象:Celery(...) 是放在一个模块下的 # 1)终端切换到该模块所在文件夹位置:scripts # 2)执行启动worker的命令:celery worker -A 模块名 -l info -P eventlet # 注:windows系统需要eventlet支持,Linux与MacOS直接执行:celery worker -A 模块名 -l info # 注:模块名随意 # 如果 Celery对象:Celery(.

dos命令

打开CMD的方式:1.开始+系统+命令提示符2.win键+R 输入cmd打开控制台3.在任意的文件夹下面,按住shift键+鼠标右键点击,在此处打开命令行窗口4.资源管理器的地址栏前面加上cmd路径======================================常用的dos命令:1.查看当前目录下所有文件:dir2.清理屏幕:cls3.退出终端:exit4.打开应用:calc,mspaint;notepad