python 进程笔记一 (概念+示例代码)
1. 进程的概念
进程是资源分配的最小单位,也是线程的容器,线程(python 线程 (概念+示例代码))是CPU调度的基本单位,一个进程包括多个线程。
程序:例如xxx.py是一个程序
进程:一个程序运行起来后,代码+用到的资源称为进程,它是系统分配资源的基本单位。
2. 进程的状态
在计算机工作中,其任务数往往大于CPU核数,即一定有一些任务正在执行,而另外一些任务在等待CPU执行,因此进程有了不同的状态。
就绪态:运行的条件都已经满足,正在等待CPU执行
执行态:CPU正在执行其功能
等待态:等待某些条件满足,例如一个程序sleep了,此时处于等待态
3. 进程的基本使用
multiprocessing模块时夸平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情。
子进程的创建:
import time,multiprocessingdef work1():for i in range(5):print("正在运行 work1...")time.sleep(0.5)if __name__ == '__main__':process_obj = multiprocessing.Process(target=work1) # 创建子进程对象process_obj.start() # 启动进程print("主进程同时在运行...")
结果:
子进程的语法结构、常用方法和常用属性:
4.进程的名称和PID
4.1 获取主进程的名称
if __name__ == '__main__':print(multiprocessing.current_process())
结果:
4.2 获取子进程的名称
import time,multiprocessingdef work1():print(multiprocessing.current_process()) # 获取子进程名称time.sleep(1)if __name__ == '__main__':process_obj = multiprocessing.Process(target=work1) # 创建子进程对象process_obj.start() # 启动进程
结果:
4.3 设置子进程的名称
import time,multiprocessingdef work1():print(multiprocessing.current_process()) # 获取子进程名称time.sleep(1)if __name__ == '__main__':process_obj = multiprocessing.Process(target=work1, name="MyProcess") # 创建子进程对象process_obj.start() # 启动进程
结果:
4.4 获取进程PID (process id)
方式一,通过multiprocessing模块获取
获取主进程pid:
if __name__ == '__main__':print(multiprocessing.current_process().pid) # 获取主进程pid
获取子进程pid:
import time,multiprocessingdef work1():print(multiprocessing.current_process().pid) # 获取子进程pidtime.sleep(1)if __name__ == '__main__':process_obj = multiprocessing.Process(target=work1, name="MyProcess") # 创建子进程对象process_obj.start() # 启动进程
方式二,通过os模块获取
import osif __name__ == '__main__':print(os.getpid()) # 获取主进程pid
4.5 获取子进程的父id
import time,multiprocessing,osdef work1():print("该子进程的父id是:%s" % str(os.getppid())) # 获取子进程父idtime.sleep(1)if __name__ == '__main__':process_obj = multiprocessing.Process(target=work1, name="MyProcess") # 创建子进程对象process_obj.start() # 启动进程print(os.getpid())
结果:
4.6 杀掉进程
import time,multiprocessing,osdef work1():for i in range(10):print("正在运行work1...",i,"子进程pid:",multiprocessing.current_process().pid)time.sleep(1)if __name__ == '__main__':process_obj = multiprocessing.Process(target=work1, name="MyProcess") # 创建子进程对象process_obj.start() # 启动进程print("主进程pid:", multiprocessing.current_process().pid)time.sleep(2)os.popen("taskkill /f /t /im " + str(multiprocessing.current_process().pid)) # 杀死主进程
结果:
也可以采用terminate()方法来中止子进程执行:
import time,multiprocessingdef work1():for i in range(5):print("正在运行work1...")time.sleep(0.5)if __name__ == '__main__':process_obj1 = multiprocessing.Process(target=work1)process_obj1.start()time.sleep(1)process_obj1.terminate() # 关闭子进程exit() # 关闭主进程print("123456")
结果:
5. 进程参数、全局变量问题
5.1 进程的参数传递
方式一、使用 args 传递元组:
import time,multiprocessingdef work1(a, b, c):for i in range(5):print("a=%d, b=%d, c=%d" % (a,b,c))time.sleep(1)if __name__ == '__main__':process_obj = multiprocessing.Process(target=work1, args=(10,20,30)) # 创建子进程对象process_obj.start() # 启动进程
方式二、使用 kwargs 传递字典:
import time,multiprocessingdef work1(a, b, c):for i in range(5):print("a=%d, b=%d, c=%d" % (a,b,c))time.sleep(1)if __name__ == '__main__':process_obj = multiprocessing.Process(target=work1, kwargs={"c":30,"a":10,"b":20}) # 创建子进程对象process_obj.start() # 启动进程
方式三、混合使用 args 和 kwargs:
import time,multiprocessingdef work1(a, b, c):for i in range(5):print("a=%d, b=%d, c=%d" % (a,b,c))time.sleep(1)if __name__ == '__main__':process_obj = multiprocessing.Process(target=work1, args=(10,),kwargs={"c":30, "b":20}) # 创建子进程对象process_obj.start() # 启动进程
三种方式的结果均如下图所示
5.2 进程间不共享全局变量
import time,multiprocessingg_num = 10def work1():global g_numfor i in range(5):g_num += 1print("---work1---",g_num)def work2():time.sleep(2)print("---work2---",g_num)if __name__ == '__main__':process_obj1 = multiprocessing.Process(target=work1)process_obj2 = multiprocessing.Process(target=work2)process_obj1.start()process_obj2.start()time.sleep(2)print("---mian---",g_num)
结果:
原因是每个子进程会把主进程中的部分资源(如:变量g_num的值)分别复制到各自的子进程内,子进程内部改变的是复制的全局变量的值,不影响主进程和其它子进程的全局变量的值。
6 守护主进程
6.1没有守护主进程
import time,multiprocessingdef work1():for i in range(5):print("正在运行work1...")time.sleep(0.5)if __name__ == '__main__':process_obj1 = multiprocessing.Process(target=work1)process_obj1.start()time.sleep(1)print("结束主进程")exit()print("123456")
结果:
可以看出主进程结束后,子进程依然在执行。
6.2 守护主进程
import time,multiprocessingdef work1():for i in range(5):print("正在运行work1...")time.sleep(0.5)if __name__ == '__main__':process_obj1 = multiprocessing.Process(target=work1)process_obj1.daemon = True # 设置子进程守护主进程process_obj1.start()time.sleep(1)print("结束主进程")exit()print("123456")
结果:
可以看到当主进程结束后,子进程也结束了。
7. 消息队列的基本操作
7.1 Queue介绍
可以使用multprocessing模块的Queue实现多进程之间的是数据传递
Queue本身是一个消息队列程序
7.2 创建Queue
import multiprocessing# 创建队列
queue = multiprocessing.Queue(5) # 5表示队列长度为5
7.3 向Queue中放值
方式一、使用put()方法
import multiprocessing# 创建队列
queue = multiprocessing.Queue(5) # 5表示队列长度为5# 向队列放值
queue.put(1)
queue.put("hello")
queue.put([1,2,3])
queue.put((4,5,6))
queue.put({"a":10,"b":20})
# queue.put(2) # 由于队列长度为5,当准备向队列放入第6个值时,队列就会处于阻塞状态,默认等待直到队列取出值后有空余位置
方式二、使用put_nowait()方法
import multiprocessing# 创建队列
queue = multiprocessing.Queue(5) # 5表示队列长度为5# 向队列放值
queue.put_nowait(1)
queue.put_nowait("hello")
queue.put_nowait([1,2,3])
queue.put_nowait((4,5,6))
queue.put_nowait({"a":10,"b":20})
# queue.put_nowait(2) # 超出队列长度直接报错
7.4 从Queue中取值
方式一 、使用get()方法
import multiprocessing# 创建队列
queue = multiprocessing.Queue(5) # 5表示队列长度为5# 向队列放值
queue.put_nowait(1)
queue.put_nowait("hello")
queue.put_nowait([1,2,3])
queue.put_nowait((4,5,6))
queue.put_nowait({"a":10,"b":20})# 取值
for i in range(6):value = queue.get()print(i,value)
当取第6个值时,由于队列已经空了,此时队列会处于阻塞状态,直到有新的值进入队列
方式二、使用get_nowait()方法
import multiprocessing# 创建队列
queue = multiprocessing.Queue(5) # 5表示队列长度为5# 向队列放值
queue.put_nowait(1)
queue.put_nowait("hello")
queue.put_nowait([1,2,3])
queue.put_nowait((4,5,6))
queue.put_nowait({"a":10,"b":20})# 取值
for i in range(6):value = queue.get_nowait()print(i,value)
当队列已经空后,再取值会报错
7.4 从Queue中取值
方式一 、使用get()方法
import multiprocessing# 创建队列
queue = multiprocessing.Queue(5) # 5表示队列长度为5# 向队列放值
queue.put_nowait(1)
queue.put_nowait("hello")
queue.put_nowait([1, 2, 3])
queue.put_nowait((4, 5, 6))
queue.put_nowait({"a": 10, "b": 20})# 取值
for i in range(6):value = queue.get()print(i, value)# 结果
# 0 1
# 1 hello
# 2 [1, 2, 3]
# 3 (4, 5, 6)
# 4 {'a': 10, 'b': 20}
当取第6个值时,由于队列已经空了,此时队列会处于阻塞状态,直到有新的值进入队列
方式二、使用get_nowait()方法
import multiprocessing# 创建队列
queue = multiprocessing.Queue(5) # 5表示队列长度为5# 向队列放值
queue.put_nowait(1)
queue.put_nowait("hello")
queue.put_nowait([1,2,3])
queue.put_nowait((4,5,6))
queue.put_nowait({"a":10,"b":20})# 取值
for i in range(6):value = queue.get_nowait()print(i,value)
当队列已经空后,再取值会报错
8. 消息队列的常见判断
8.1 判断队列是否已满
import multiprocessing# 创建队列
queue = multiprocessing.Queue(3) # 5表示队列长度为5# 向队列放值
queue.put_nowait(1)
queue.put_nowait("hello")
queue.put_nowait([1,2,3])# 判断队列是否已满
print(queue.full())
结果:
8.2 判断队列的消息数量
print(queue.qsize())
8.3 判断队列是否为空
print(queue.empty())
有一定的概率会打印相反的结果,因此在调用empty()方法前,通常可以sleep 0.00001秒
或使用
if queue.qsize() == 0:
来判断队列是都为空
9. Queue实现进程间数据共享
在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据,看看子进程read_queue能否读取到子进程write_queue写入到队列中的数据。
import multiprocessing,timedef write_queue(queue):"""写入数据到队列"""for i in range(10):if queue.full():print("队列已满")breakelse:queue.put(i)print("已经写入:%d" % i)time.sleep(0.5)def read_queue(queue):"""读取队列数据并显示"""while True:if queue.qsize() == 0:print("队列已空")breakelse:value = queue.get()print("获取数据:%d" % value)if __name__ == '__main__':# 创建空队列queue = multiprocessing.Queue(5)# 创建两个子进程write_q = multiprocessing.Process(target=write_queue, args=(queue,))read_q = multiprocessing.Process(target=read_queue, args=(queue,))write_q.start()# 让写入队列的子进程先执行write_q.join()read_q.start()
结果:
10. 进程池
10.1 进程池概述
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程,但如果是成百上千个进程,用手动方式创建就十分麻烦,此时就可以用到multiprocessing模块提供的Pool方法。
初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求,但如果池中的进程数已经达到最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。
10.2 multiprocessing.Pool常用函数
1.apply()
进程池中进程以同步方式执行任务
import multiprocessing,timedef copy_work(a,b):"""用于模拟文件拷贝的函数"""print("正在拷贝文件...",multiprocessing.current_process(),a,b)time.sleep(0.5)if __name__ == '__main__':# 创建进程池pool = multiprocessing.Pool(3) # 最大允许创建3个进程for i in range(10):# 让进程池以同步方式执行copy_workpool.apply(copy_work,(10,20))
结果:
2.apply_async()
进程池中进程以异步方式执行任务
如果使用apply_async方式,需要做以下两点:
(1)pool.close() 表示不再接收新的任务
(2)pool.join() 让主进程等待进程池执行结束后再退出
import multiprocessing,timedef copy_work(a,b):"""用于模拟文件拷贝的函数"""print("正在拷贝文件...",multiprocessing.current_process(),a,b)time.sleep(0.5)if __name__ == '__main__':# 创建进程池pool = multiprocessing.Pool(3) # 最大允许创建3个进程for i in range(10):# 让进程池以异步方式执行copy_workpool.apply_async(copy_work,(10,20))pool.close()pool.join()
结果:
10.3 进程池中的Queue
专门用于进程池中的进程间的数据共享
(1)同步方式
import multiprocessing,timedef write_queue(queue):"""写入数据到队列"""for i in range(10):if queue.full():print("队列已满")breakelse:queue.put(i)print("已经写入:%d" % i)time.sleep(0.5)def read_queue(queue):"""读取队列数据并显示"""while True:if queue.qsize() == 0:print("队列已空")breakelse:value = queue.get()print("获取数据:%d" % value)if __name__ == '__main__':# 创建进程池pool = multiprocessing.Pool(2)# 创建进程池中的队列queue = multiprocessing.Manager().Queue(5)# 使用进程池执行任务(同步方式)pool.apply(write_queue, (queue,))pool.apply(read_queue, (queue,))
结果:
(2)异步方式
import multiprocessing,timedef write_queue(queue):"""写入数据到队列"""for i in range(10):if queue.full():print("队列已满")breakelse:queue.put(i)print("已经写入:%d" % i)time.sleep(0.5)def read_queue(queue):"""读取队列数据并显示"""while True:if queue.qsize() == 0:print("队列已空")breakelse:value = queue.get()print("获取数据:%d" % value)if __name__ == '__main__':# 创建进程池pool = multiprocessing.Pool(2)# 创建进程池中的队列queue = multiprocessing.Manager().Queue(5)# 使用进程池执行任务(异步方式)pool.apply_async(write_queue, (queue,))pool.apply_async(read_queue, (queue,))pool.close() # 表示不再接收新的任务pool.join() # 主进程会等待进程池执行结束后再退出
结果:
11. 案例:进程池实现文件夹拷贝器
目标:使用进程池实现文件夹整体拷贝到另外一个目录
思路:
import multiprocessing,time,osdef copy_file(source_dir, target_dir, file):print(multiprocessing.current_process())source_path = source_dir + "/" + filetarget_path = target_dir + "/" + file# print("%s --> %s" % (source_path, target_path))# 读取源文件内容with open(source_path,"rb") as source_file:# 创建目标文件with open(target_path, "wb") as target_file:while True:# 读源文件保存到目标文件source_file_data = source_file.read(1024) # 每次读1024个字节if source_file_data: # 判断是否完成读取源文件target_file.write(source_file_data)else:breakif __name__ == '__main__':source_dir = "C:/Users/DOUH/Desktop/pythonCode" # 源文件路径target_dir = "C:/Users/DOUH/Desktop/test" # 目标文件路径# 在指定位置创建test文件夹try:os.mkdir(target_dir)except:pass# 获取源文件夹中的所有的文件file_list = os.listdir(source_dir)# 创建进程池pool = multiprocessing.Pool(3)for file in file_list:# 拷贝文件pool.apply_async(copy_file, (source_dir, target_dir, file))pool.close()pool.join()
结果:
12. 案例:使用多进程向同一文件写入数据
import multiprocessing# 设置回调函数
def setcallback(x):with open('result.txt', 'a+') as f:line = str(x) + "\n"f.write(line)def multiplication(num):return numif __name__ == '__main__':pool = multiprocessing.Pool(6)for i in range(1000):pool.apply_async(func=multiplication, args=(i,), callback=setcallback)pool.close()pool.join()
参考:
1.python 多进程一篇学懂
2.Python基础之多进程
3.【Python】Python多进程详解
4.Python多进程详解
5.python 进程 (概念+示例代码)
相关文章:
python 进程笔记一 (概念+示例代码)
1. 进程的概念 进程是资源分配的最小单位,也是线程的容器,线程(python 线程 (概念示例代码))是CPU调度的基本单位,一个进程包括多个线程。 程序:例如xxx.py是一个程序 进程…...
各中间件数据库默认访问端口总结
说明 在生态丰富的开发环境下,我们常常需要接触很多中间件产品,中间件默认的连接端口以及可视化ui访问端口也时不时的需要用到,这里循序渐进做好登记,以备查阅! 中间件/数据库名称默认端口管理台端口默认账号密码rabbi…...
鲲鹏arm64架构下安装KubeSphere
鲲鹏arm64架构下安装KubeSphere 官方参考文档: https://kubesphere.io/zh/docs/quick-start/minimal-kubesphere-on-k8s/ 在Kubernetes基础上最小化安装 KubeSphere 前提条件 官方参考文档: https://kubesphere.io/zh/docs/installing-on-kubernetes/introduction/prerequi…...
python 函数-02-返回值注释格式
01 函数返回值 1)python中函数可以没有返回值,也可以有通过return的方式 – 【特殊性,区别于java c#等】 2)返回值可以是一个或者多个,多个时通过逗号隔开 – 【特殊性,区别于java c#等】 3)多…...
【前端素材】推荐优质后台管理系统Upcube平台模板(附源码)
一、需求分析 后台管理系统在多个层次上提供了丰富的功能和细致的管理手段,帮助管理员轻松管理和控制系统的各个方面。其灵活性和可扩展性使得后台管理系统成为各种网站、应用程序和系统不可或缺的管理工具。 当我们从多个层次来详细分析后台管理系统时࿰…...
可视化 RAG 数据 — 用于检索增强生成的 EDA
原文地址:Visualize your RAG Data — EDA for Retrieval-Augmented Generation 2024 年 2 月 8 日 Github:https://github.com/Renumics/rag-demo/blob/main/notebooks/visualize_rag_tutorial.ipynb 为探索Spotlight中的数据,我们使用Pa…...
数学建模论文、代码百度网盘链接
1.[2018中国大数据年终总决赛冠军] 金融市场板块划分与轮动规律挖掘与可视化问题 2.[2019第九届MathorCup数模二等奖] 数据驱动的城市轨道交通网络优化策略 3.[2019电工杯一等奖] 露天停车场停车位的优化设计 4.[2019数学中国网络数模一等奖] 基于机器学习的保险业数字化变革…...
mysql 迁移-data目录拷贝方式
背景:从服务器进水坏掉,50多G的数据库要重新做主从,但以导入导出的方式太慢,简直是灾难性的,一夜都没好,只好想到了拷贝mysql数据文件的方式 拷贝的数据文件的前提 1.数据库版本必需一致(可以…...
学习 LangChain 的 Passing data through
学习 LangChain 的 Passing data through 1. Passing data through2. 示例 1. Passing data through RunnablePassthrough 允许不改变或添加额外的键来传递输入。这通常与 RunnableParallel 结合使用,将数据分配给映射中的新键。 RunnablePassthrough() 单独调用&…...
C# OpenVINO PaddleSeg实时人像抠图PP-MattingV2
目录 效果 项目 代码 下载 C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2 效果 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Diagnostics; using System.Drawing; using System.Security.Cryptography; using System.Text; us…...
【Android 11】AOSP Settings WIFI随机MAC地址功能
AOSP Settings WIFI随机MAC地址功能 背景 最近客户提出了想要实现随机WIFIMAC地址的功能(我们默认WIFI的MAC地址是固定的)。网上搜到了一篇不错的文章,本次改动也是基于这个来写的。 由于客户指定使用的settings是AOSP的,所以在…...
dmrman备份还原
脱机还原工具-dmrman 前言 根据达梦官网文档整理 一、概述 DMRMAN 命令行设置参数执行又可分为命令行指定脚本、命令行指定语句两种执行方式。 指定语句 $ DMRMAN RMAN>BACKUP DATABASE/dmdata/data/DAMENG/dm.ini;指定脚本 创建一个名为 cmd_file.txt 的文件&#x…...
网页403错误(Spring Security报异常 Encoded password does not look like BCrypt)
这个错误通常表现为"403 Forbidden"或"HTTP Status 403",它指的是访问资源被服务器理解但拒绝授权。换句话说,服务器可以理解你请求看到的页面,但它拒绝给你权限。 也就是说很可能测试给定的参数有问题,后端…...
单细胞多组学整合与对齐的计算方法
Computational Methods for Single-cell Multi-omics Integration and Alignment Bioinformatics-2022-密西根大学 关键词:单细胞;多组学;机器学习;无监督学习;集成 摘要 最近发展起来的生成单细胞基因组数据的技术在生物学领域产生了革命性的影响。多组学测定提…...
33.openeuler OECA认证模拟题16
一 、选择题 1.如何查看系统支持的 shell? A、cat /etc/passwd B、cat /etc/shells C、echo SSHELL D、echo $0 答案 :B 2.下列哪项不是 shell的功能? A 、 用户界面,提供用户与内核交互接口 B 、 命令解释器 C 、提供编译环境 D 、 提供各种管理工具,…...
javaScript数组去重的几种实现方式——适用非引用数据去重
最传统的使用循环遍历 //最传统的使用循环遍历 function getUnique(arr) {let newArr [];for (let i 0; i < arr.length; i) {for (let j i 1; j < arr.length; j) {if (arr[i] arr[j]) {i; //相同丢掉前面的元素}}newArr.push(arr[i]);}return newArr; } 利用Set实…...
Nexus Repository Manager
Nexus Repository Manager https://s01.oss.sonatype.org/#welcome https://mvnrepository.com/-CSDN博客...
Python世界之运算符
一、算术运算符 以下假设变量: a10,b20: 运算符 描述 实例 加 - 两个对象相加 a b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结…...
蓝桥杯倒计时47天!DFS基础——图的遍历
倒计时47天! 深度优先搜索——DFS 温馨提示:学习dfs之前最好先了解一下递归的思想。 DFS基础——图的遍历 仙境诅咒 问题描述 在一片神秘的仙境中,有N位修仙者,他们各自在仙境中独立修炼,拥有自己独特的修炼之道…...
体验LobeChat搭建私人聊天应用
LobeChat是什么 LobeChat 是开源的高性能聊天机器人框架,支持语音合成、多模态、可扩展的(Function Call)插件系统。支持一键免费部署私人 ChatGPT/LLM 网页应用程序。 地址:https://github.com/lobehub/lobe-chat 为什么要用Lobe…...
ClickHouse 指南(三)最佳实践 -- 主键稀疏索引
在ClickHouse主索引的实用介绍 ClickHouse release 24.1, 2024-01-30 1、简介 在本指南中,我们将深入研究ClickHouse索引。我们将详细说明和讨论: ClickHouse中的索引与传统的关系数据库管理系统有何不同ClickHouse是如何构建和使用表的稀疏主索引的什么是在Clic…...
【Nginx】Nginx配置反向代理 和 https
nginx.conf配置 进入linux /etc/nginx/ 打开nginx.conf 进行以下配置 http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {#监听443端口listen 443 ssl;#你的域名server_name huiblog.top;#ssl证书的pe…...
ChatGPT第七讲
ChatGPT为什么会被热炒? 2023年上半年,ChatGPT引起了广泛的热议,对于ChatGPT有多热,不需要我重复了,你可能在网上看到了很多报道,标题如《ChatGPT揭开AI战幔:杀死黄页一样摧毁Google?…...
Chapter 2 of Effective C++ (构造/析构/赋值运算)
条款06:了解C默默编写并调用哪些函数 Know what functions C silently writes and calls 编译器会为空类生成一个copy构造函数、copy assignment操作符和一个析构函数。此外如果你没有声明任何构造函数,它也会生成一个默认构造函数。 (对C1…...
Android学习笔记 service启动方式
在Android系统中,Service的启动方式主要有两种: ## 1. startService 这种方式用于启动一个服务执行后台任务,不进行通信。当你调用startService()方法启动服务后,服务会一直无限期运行下去,只有在外部调用了stopServi…...
Redis 工具类 与 Redis 布隆过滤器
Redis 工具类 1. 核心依赖 <!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>com.google.guava…...
自定义el-upload 上传文件
前言 最近在做一个文件上传的功能,后端接口写好了、发现前端上传文件的页面不会写……(我很笨的)然后我就找啊找发现element有个组件是<el-upload/>能直接上传文件。我就想直接用拿来改改改成自己想要的,可是就是这样我花了…...
LeetCode69. x 的平方根(C++)
LeetCode69. x 的平方根 题目链接代码 题目链接 https://leetcode.cn/problems/sqrtx/description/ 代码 class Solution { public:int mySqrt(int x) {int right x, left 0, ans -1;while(left < right){long long mid left (right - left) / 2;if(mid * mid <…...
[c++] 单例模式 + cyberrt TimingWheel 单例分析
单例模式要求一个类在一个进程中只能创建一个对象。比如 cyberrt 中的 TimingWheel 类就是单例模式,这个类管理着一个进程内的所有定时器,只需要一个对象就可以。 单例模式的实现有两种方式,懒汉式和饿汉式。懒汉式,当第一次使用…...
如何在cmd里面创建一个vue项目
在命令提示符(CMD)中创建一个Vue项目,你需要先确保你已经全局安装了Vue CLI(Vue的命令行工具)。如果你还没有安装Vue CLI,可以通过以下命令进行安装: bash复制代码 npm install -g vue/cli # O…...
网站开发算是固定资产吗/今日广州新闻头条
Camtasia是一款专业的屏幕录制和软件,用户可以通过它来录制自己的电脑屏幕,包括实时动画、PPT播放,兼以音频录制、视频制作等功能,支持用户一站式完成屏幕录制和后期处理操作。 自软件发行以来,Camtasia每个版本都在不…...
杭州的做网站公司/seo怎么学
我正在尝试创建自定义单选按钮,如下图所示.我编写了代码,能够实现正确的样式,但无法在单选按钮之前显示标签..lengend-action-buttons {float: left;margin-left: 10px;margin-top: 10px;}label {font-weight: normal;font-size: 14px;Font-Family: Metric-Regular;Color: #666…...
做网站asp和asp.net/网络销售怎么干
面向对象是将行为权限分割到个体,个体的行为会产生一系列的连锁反应。而这些反应应是原始个体所不能直观掌控的。面对复杂问题,面向对象更有力,因为它民主,具有无比的弹性;而面对简单问题,结构化更有效&…...
图书类网站开发的背景/东莞关键词排名快速优化
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模…...
iis7搭建网站织梦/搜索引擎优化缩写
使用 declare 语句和strict_types 声明来启用严格模式: Caution: 启用严格模式同时也会影响返回值类型声明. Note: 严格类型适用于在启用严格模式的文件内的函数调用,而不是在那个文件内声明的函数。 一个没有启用严格模式的文件内调用了一个…...
先做网站还是先解析/it培训
layui怎么实现三级联动?下面本篇文章给大家介绍一下使用layui实现三级联动效果。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。基于layui的三级联动模块直接进入主题吧。封装的模块需要固定的html代码,因为是通…...