python多进程,多线程,协程

Python爬虫中多线程、多进程、多协程的介绍和对比 前面咱们也写了好几篇爬虫的文章,都是些数据量不是很多的例子。那如果遇到数据量比较大的时候怎么办提高速度和效率呢。今天的这篇会给你答案。 一、线程、进程、协程的简介 1.同步、异步、并行、并发 同步:各个任务不是独自运行的,任务之间有一定的运行顺序 异步:各个任务是独立运行的,一个任务的运行不收另一个任务的影响 并行:同一时刻发生若干事情的情况 并发:同一时间段发生若干事情。 这里可能并行和并发... 阅读详情

 

线程依赖于进程,协程依赖于线程,效率最好的是协程,其次到线程,再到进程。总结:单线程会阻塞,协程不会阻塞。主要看会不会阻塞,其次看耗不耗资源。对比之下协程是最好的。

 

主线程结束,子线程才会结束。程序和进程通俗来讲就是一个运行一个不运行,不运行的叫程序,运行起来的叫进程。程序只有一个,但是进程可以有多个,即是一个程序可以对应多个进程。进程是一个拥有资源的地方。资源是一个资源分配的地方。如一个qq,你运行起来,就是一个进程,就可以让操作系统去调度,让它拥有操作摄像头,鼠标,键盘等功能。

 

从线程和进程的角度来说,进程是资源分配的最小单位,线程是独立调度的最小单位。
同一个进程中的多个线程之间可以并发执行,他们共享进程资源。
线程不拥有资源,线程可以访问隶属进程的资源,进程有自己的独立空间地址,线程没有自己的独立空间地址,但是线程有自己的堆栈和局部变量。

进程是系统程序执行和分配资源的基本单元。

线程是使用进程内存的空间,如QQ发消息是线程,是QQ给它的资源。

进程创建的时候会把主进程的东西都复制一遍,即是把代码都复制一遍来运行,但是并不是完全相同,入进程号等。代码在运行的过程中不会改变,改变的是数据。子进程会把主进程的内存,代码,资源等都复制一遍。总结:相当于代码是共享的。

手机里面的应用多开,就是多进程。进程先有才有线程。进程是资源分配的基本单位,线程是操作系统调度的基本单位。

真正运行的是线程。

进程与进程间是互相独立的。socket 通过网络可以进行进程间的通信,也可以通过文件完成进程间的通信(但是效率很低),和内存和磁盘的效率有关。

线程与进程的区别:必须有进程才能有线程,打个比方,进程就像车间里面的流水线,线程就是流水线上的工人。那个流水线就是资源,用这个资源的就是线程(工人)。一条流水线上面可以安排一个工人在那生产产品,但是效率很低,也浪费了流水线的资源。多线程的意思就是一条流水线上面安排了很多工人在那生产产品,生产产品的效率显然就会高很多,资源也得到了充分的利用。但是随着业务的发展,一条流水线虽然安排满了工人(即是进程里面开启了很多线程),还是无法满足市场的需求,因为一条流水线上的资源有限(工位有限),你分配再多的工人也提高不了多大的效率,多分配的人只能在那里闲着。所以想要提高效率,多生产产品,必须要多开几条流水线(即是多进程)。然后几条流水线一起生产产品,这样效率就会大大提高。所以说进程是资源的分配单位,线程是调度单位。即是真正干活的是线程(流水线工人),进程只是给线程提供资源(流水线工位)。必须有进程才有线程。线程不能独立运行,必须依存在进程中。即是工人不能独立地生成产品,必须依靠流水线才能完成一件产品的生产。一个QQ就是一个进程,它里面有很多线程,来执行操作系统调度。

 

#_author:'DJS'
#date:2018-12-07
import time
import threading
import random
from queue import Queue
def coding():
    for i in range(3):
        print("正在写代码%d"%i)
        time.sleep(1)

def huatu():
    for i in range(3):
        print("正在画图%d"%i)
        time.sleep(1)
def main():
    t1 = threading.Thread(target=coding) #这里传的时候是传coding的并不是传conding()的
    #传coding()指的是传一个函数的返回值(就是执行这个函数)
    t2 = threading.Thread(target=huatu)
    t1.start()
    t2.start()

VALUE = 0 #定义一个全局变量
gLock = threading.Lock() #创建线程锁

def add_value():
    global VALUE #在函数中引用或修改全局变量,要用global注明
    gLock.acquire() #上锁
    for i in range(1000000):  #线程执行的次数多,量大的时候,
        # 可能会造成线程不安全,造成数据 的错误。所以要对他进行上锁,然后解锁。
        #锁只加在修改全局变量的地方,对于那些访问全局变量的地方不用添加。对个线程
        #访问全局变量不会造成数据的错误
        VALUE+=1
    gLock.release() #解锁
    print("最后执行完%d"%VALUE)

def main():
    for x in range(10): #这里循环十次,表示的是add_value执行十次。
        t = threading.Thread(target=add_value)
        t.start()


##lock版的生成者与消费者模式
gMoney = 1000
gLock = threading.Lock() #创建一把锁
gTotaltime = 10
gTime = 0
class Producer(threading.Thread):
    def run(self):
        global gMoney
        global gTime
        while True:
            monge = random.randint(100,1000) #随机产生100到1000的整数
            gLock.acquire() #上锁
            if gTime>=gTotaltime:
                gLock.release() #在braek之前想要解锁。
                break #在这里braek掉,但是加的锁还没有释放,程序会一直被锁死,运行不了其他的代码,braek的同时
                #也要解锁
            gMoney+=monge
            print("%s生成了%d钱还剩%d钱"%(threading.current_thread(),monge,gMoney))
            gTime+=1
            gLock.release() #释放锁
            time.sleep(0.5)

class Consumer(threading.Thread):
    def run(self):
        global gMoney
        while True:
            money = random.randint(100,1000)
            gLock.acquire()
            if gMoney >= money:
                gMoney -= money
                print("%s消费者消费了%d元钱,剩余%d元钱"%(threading.current_thread(),money,gMoney))

            else:
                if gTime>=gTotaltime:
                    gLock.release()
                    break  #如果生成者不生产了,就释放锁,然后退出
                print("%s消费者消费%d元钱,剩余%d,不足"%(threading.current_thread(),money,gMoney))
            gLock.release()#解锁不能放在if里面,要对应起来放,要不然就成了死锁
            time.sleep(0.5)

def main():
    for i in range(5):
        t = Producer(name="生成者线程%d"%i)
        t.start()

    for i in range(3):
        t = Consumer(name="消费者线程%d"%i)
        t.start()

##condition生产者与消费者模式

gMoney = 1000
gCondition = threading.Condition()#创建一把锁
gTotaltime = 10
gTime = 0
class Producer(threading.Thread):
    def run(self):
        global gMoney
        global gTime
        while True:
            monge = random.randint(100,1000) #随机产生100到1000的整数
            gCondition.acquire() #上锁
            if gTime>=gTotaltime:
                gCondition.release() #在braek之前想要解锁。
                break #在这里braek掉,但是加的锁还没有释放,程序会一直被锁死,运行不了其他的代码,braek的同时
                #也要解锁
            gMoney+=monge
            print("%s生成了%d钱还剩%d钱"%(threading.current_thread(),monge,gMoney))
            gTime+=1
            gCondition.notify_all() #生产完后就通知所有在等待的线程
            gCondition.release() #释放锁
            time.sleep(0.5)

class Consumer(threading.Thread):
    def run(self):
        global gMoney
        while True:
            money = random.randint(100,1000)
            gCondition.acquire()
            while gMoney < money:
                if gTime>=gTotaltime:
                    gCondition.release()
                    return #退出这个函数的所有层循环
                print("%s消费了%d元钱,还剩余%d元钱,不足"%(threading.current_thread(),money,gMoney))
                gCondition.wait() #等待有钱的时候就释放锁
            gMoney-=money
            print("%s消费了%d元钱,剩余%d元钱"%(threading.current_thread(),money,gMoney))
            gCondition.release()#解锁不能放在if里面,要对应起来放,要不然就成了死锁
            time.sleep(0.5)

def main():
    for i in range(5):
        t = Producer(name="生成者线程%d"%i)
        t.start()

    for i in range(3):
        t = Consumer(name="消费者线程%d"%i)
        t.start()

##队列
q = Queue(4) #创建4个队列
q.put(1) #往队列中添加一个元素
print(q.qsize()) #q.qsize获取队列中总共有多少个元素
print(q.empty())#判断多了是否为空,是返回ture,不是空返回flase
print(q.full())#判断队列是否满了
for i in range(4): #往队列中添加4个数,这样队列就满了
    q.put(i)
print(q.full())
for i in range(4):
    print(q.get()) #从队列中拿数据出来,以先进先出的原则来拿

q.put(block=True) #,默认是阻塞式的,意思是往队列里面添加值
队列如果满了,就一直在那等,直到等到没有满
def set_value(q):
    index = 0
    while True:
        q.put(index)
        index+=1
        time.sleep(1) #每隔一秒就往队列里面添加值

def get_value(q):
    while True:
        print(q.get()) #获取不到数据会一直在这里等,直到等到上面那个队列中添加有数据再打印
        #即是一直处于阻塞状态

def main():
    q = Queue(6)
    t1 = threading.Thread(target=set_value,args=[q]) #创建一个线程,并这个方法里面往里面传递参数。
    t2 = threading.Thread(target=get_value,args=[q]) #这个个类创建对象
      t2 对于get_value 这个可以说是主线程,get_value 是子线程
       Thread是threading这个包的一个类
    t1.start() #主线程会等待子线程结束后再结束
    t2.start()
if __name__ == '__main__':
    main()


## 查看程序中的线程数
def test1():
    for i in range(5):
        print("test1%d"%i)
        time.sleep(1)


def test2():
    for i in range(5):
        print("test2%d" % i)
        time.sleep(1)


def main():
    t1 = threading.Thread(target=test1) #target中指定一个线程名,那么这个线程就去函数里面执行了
    t2 = threading.Thread(target=test2)
    #target指定将来这个线程去那个函数执行代码
    #args指定将来调用函数的时候传递什么数据过去,函数括号里面可以随便定义一个变量
    #接收传递过去的数据,不是把args作为变量作为函数接收数据的参数
    #多线程一般都是共享数据的,比如一个线程负责抓数据,一个线程负责处理数据,一个线程负责保存数据
    #这样通过共享数据就可以完成了数据的爬取,处理,保存。
    t1.start()
    # time.sleep(1)
    # t2.start()
    # time.sleep(1)
    # #time.sleep(1)#设置延时,让三个任务按照顺序来执行,查看线程数
    # while True:
    #     print(threading.enumerate())
    #     if len(threading.enumerate())<=1:
    #         break
    #一个线程的开始是在star()那里开始的
    # #这是三个任务,执行的先后顺序是操作系统说了算
    #操作系统可能先执行t1,也可以先执行t2,三个任务的执行顺序是无序的
    #线程的运行是无序的,随机的。所以想要三个任务按照顺序来执行就要设置
    #延时了,分别在其他两个那里设置延时就可以按照顺序执行了

if __name__ == '__main__':
    main()

 

 

 

 

 

 

 

 

 

 

 

【Python】深入解析Python的并发编程:多线程、多进程和协程的对比与应用 Python中的并发编程提供了多种选择,包括多线程、多进程和协程。每种方法都有其独特的优势和适用场景:多线程适合I/O密集型任务,多进程适合CPU密集型任务,而协程则提供了轻量级的并发能力,特别适合处理大量I/O操作。本文详细分析了这三种并发模型的实现原理、优缺点,并通过示例代码展示它们的实际应用。此外,本文还将探讨在不同场景下如何选择适合的并发模型,以实现高效的并发处理。 阅读详情

相关推荐

乐视三合一体感摄像头--基本信息及windows下部分开发

乐视三合一体感摄像头--基本信息及windows下部分开发Introduction基本信息Windows下使用安装驱动使用openNI使用imageJ调用RGB图像Q:参考资料 Introduction       乐视三合一体感摄像头是乐视对标kinect,做的一款3D体感摄像头;设计目的为用于电视机上体感使用的,包括其USB结构都是为了符合电视机直接操作的,同时是支持相应的游戏操作;但是自从乐视倒闭之后,价格从之前标价899降到了现在140+左

GRF-Sunomikp31 1万+

Python使用协程的缺点

1、多核资源不能使用:协程的本质是单线程,它不能同时使用单个CPU的多核、协程。2、在多CPU上运行程需要与过程配合。当然,每天编写的大多数应用程序都没有必要。除非是cpu密集型应用。3、阻塞(Blocking)操作(如IO)会阻塞整个程序。实例。

yul364102的博客 255

二阶系统的带宽(频域分析)

下面以典型I型系统为例,计算系统的开环截止频率和闭环截止频率。设I型系统为: 1:系统的开环截止频率为 2:系统的闭环截止频率 其实我们在工程整定时,把ζ = 0.707,也把系统的带宽近视看成自然震荡角频率即 (wb≈wc≈wnw_{b}\approx w_{c}\approx w_{n}wb​≈wc​≈wn​)对于二阶系统。 ...

wanrenqi的博客 2万+

python进程,线程,协程的区别

协程 协程,又称微线程,纤程。英文名Coroutine。协程,利用线程在等待某个资源的期间执行其他函数,切换资源消耗非常小,协程效率相当快。 协助程序,线程和进程都是抢占性特点,线程和进程之间的切换我们不能参与,协程是非抢占性特点,可以由用户控制切换 1.yield函数–生成器 2.greenlet模块 3.gevent模块 进程、线程、协程的区别? 进程是资源分配的单位,真正执行代码的是线程,操...

Assassin567的博客 366

MATLAB安装

Matlab 2016a 安装包及破解教程百度云分享链接: 链接:https://pan.baidu.com/s/1i6BgD8p       密码:17gg   Matlab安装教程: 1、下载文件,得到R2016a_win64.part1.rar、R2016a_win64.part2.rar两部分安装文件和Matlab 2016a Win64 Crack破解文件。 2、解压安装文件(解...

qq_36734094的博客 17万+

STM32踩坑--NoST-LINK detected

这里出现的NoST-LINK detected是没有扫描到端口 在我使用一段Fly-MCU后,有一天突然发现出现如上错误,再检查的过程中检查以下几点 1.STM32 魔术棒的设置 1.1Debug设置 1.2 utilities 设置没有问题,与原来一样又看了下端口——在设备管理器中;也没有问题 ...

qq_53002477的博客 2万+

python协程运行阻塞机制的坑

python协程运行阻塞机制的坑 废话不多说,直接看两段代码: # 阻塞 import random import gevent import time import gevent.monkey gevent.monkey.patch_all() # 自动切换 若没有这行代码,若sleep则会顺序执行:小明1-3,小红1-3,小刚1-3实现协程 # 需要等待时,自动切换。使得sleep程序...

eli的博客 2306

手把手教你用Node.js模拟大麦APP下单请求(含滑块验证处理)

本文详细解析了如何使用Node.js模拟大麦APP下单请求的全流程,包括接口逆向、滑块验证处理和签名算法逆向等关键技术。通过实战案例和代码示例,帮助开发者掌握移动端API调用的核心要素,如动态参数构造、安全验证突破等,提升自动化下单的成功率和效率。

weixin_42569329的博客 353

canvas

​四个参数起点坐标x,y左上角坐标;宽度width矩形的宽度;​语法context.strokeRect(x,y,width,height);​8.stroke()开始绘制图形,当前路径下的所有子路经都会绘制出来;​6.fill()填充区域,此时只是填充,起点和终点并没有连接起来;​3.moveTo开始定义一条新的子路径,该方法确定了线段的起点;​4.lineTo将上面定义的线段起点和指定的新的点连接起来;​2.beginPath开始定义一条新的路径;...

qq_47455650的博客 168

3 种 VLA 模型动作表示方案对比:RT-2 离散化 vs π0 流匹配 vs HybridVLA 混合架构

本文深入对比了三种VLA模型动作表示方案:RT-2离散化、π0流匹配和HybridVLA混合架构。分析了各自的技术原理、优势与局限性,并提供了应用场景选择指南,帮助研究者在具身智能领域做出更优的技术选型决策。

weixin_29031161的博客 319

“华为杯”研究生数学建模竞赛2020年-【华为杯】B题:汽油辛烷值优化建模(附优秀论文)

摘 要:本文通过机器学习算法和数据挖掘技术,建立了汽油辛烷值(RON)损失的预测模型,在保证汽油产品脱硫效果的前提下,以降低汽油辛烷值损失在30%以上为目标,给出每个样本的优化操作条件。针对第一问,对285号和313号原始数据用给定的数据处理规范进行预处理,对每一列变量求期望,得到最终的数据补充到相应的样本编号。针对第二问,首先对数据样本按照最大最小限幅以及拉依达法则进行列变量清洗,通过两轮特征筛选确定变量:结合处理后的数据,针对产品中硫含量、RON损失值用。

getusushu的博客 1251

多线程依赖问题

遇到一个面试题: 3个线程A,B,C存在依赖关系,B依赖A执行结束,C依赖B执行结束,请设计实现。 具体实现如下: 首先,创建一个锁对象: @Data public class LockFlag { private int flag = 0; } 线程A的实现代码 public class Ajob extends Thread { private LockFlag lockFl...

xupengbo527的博客 1674

Python实现多线程、多进程及协程

本文详细介绍了 Python 中多线程、多进程和协程的并发模型及其实现方式,并通过具体场景演示了如何使用面向对象思想实现这些模型。在实际应用中,应根据任务的类型和需求选择合适的并发模型,从而优化程序的性能和资源利用率。本文将详细介绍 Python 中的多线程、多进程和协程的概念及其实现方式,并通过具体场景展示如何在 Python 中使用面向对象的思想实现这些并发模型。接下来,我们通过一个计算密集型任务的示例来演示多进程的实现:计算一系列大数字的阶乘。主程序中创建并启动了多个计算进程,并使用。

闲人编程的博客 2573

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Python中的多进程、多线程、协程

多线程相对于进程,多线程只能并发执行,不能利用多CPU,相对于协程,多线程的启动数目有限 ,占用内存资源,并且有线程切换的时间开销

SoyMilk的博客 1910

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深入浅出Python多线程、多进程、协程

特性多进程 (multiprocessing)多线程 (threading)协程 (asyncio)并行/并发并行(Parallelism) - 真正利用多核并发(Concurrency) - IO密集型效率高,CPU密集型受GIL限制并发(Concurrency) - 协作式,单线程内切换资源消耗重 (独立内存空间)轻 (共享内存空间)最轻 (用户空间,栈开销小)切换方式操作系统调度 (抢占式)操作系统调度 (抢占式)程序控制 (awaityield from) (协作式)适用场景。

MO__YE的博客 1393

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

python爬虫关于多进程,多线程,协程的使用

本文章的案例仅供学习。若因个人不当行为引发问题,责任与本人无关。

m0_64408930的博客 1万+

Python多进程、多线程、协程典型示例解析

作用:创建多个独立运行的进程(每个进程有独立内存空间)适用场景:数学计算、图像处理等CPU密集型任务核心原理:绕过Python的GIL锁,真正利用多核CPU作用:创建多个线程(共享同一进程内存)适用场景:文件读写、网络请求等I/O等待型任务核心特点:受GIL限制,同一时刻只能有一个线程执行Python字节码作用:单线程内通过任务切换实现高并发适用场景:Web服务器、高频I/O操作(如爬虫)核心机制:事件循环(Event Loop)驱动协程切换特性threadingasyncio。

漫谈网络 3587

python的多线程多进程与多协程

python的多线程是假多线程,本质是交叉串行,并不是严格意义上的并行,或者可以这样说,不管怎么来python的多线程在同一时间有且只有一个线程在执行(举个例子,n个人抢一个座位,但是座位就这一个,不管怎么抢同一时间只有一个人在座位上可能前一秒是a在座位上座,后一秒b就给抢去了)建立一个类然后继承这个类threading.Thread。多线程大体上有两种实现方式。threading模块。

weixin_45668674的博客 964

python多线程多进程协程_python 多进程,多线程,协程

在我们实际编码中,会遇到一些并行的任务,因为单个任务无法最大限度的使用计算机资源。使用并行任务,可以提高代码效率,最大限度的发挥计算机的性能。python实现并行任务可以有多进程,多线程,协程等方式。进程,线程,协程进程进程是程序运行的基本单位,资源分配和独立运行的基本单位。多进程实现并行任务代码:import multiprocessingimport timedef test(interval...

weixin_39672296的博客 219

Python 爬虫提速:【多进程、多线程、协程+异步】对比测试

Python 爬虫提速:【多进程、多线程、协程+异步】对比测试概念介绍测试环境开始测试测试【单线程单进程】测试【多进程 并行】测试【多线程 并发】测试【协程 + 异步】结果对比 Python 爬虫提速:【多进程、多线程、协程+异步】对比测试 概念介绍 首先简单介绍几个概念: 进程和线程: 进程就是一个程序在一个数据集上的一次动态执行过程(数据集是程序在执行过程中所需要使用的资源)。 线程也叫...

Python小蜗牛 4311

Python概念之多线程+多进程+协程

Python概念之多线程+多进程+协程 文案来自于 多进程 多线程 协程 只是将文案中的代码自己修改了一下,解决了自己对于文章中不懂的地方,谨做记录,平时工作中,除了appium处理多个手机的时候用过多进程,其实很少用到这方面的知识,所以做一个简单的梳理,概念性的记录 多进程 linux或者Mac操作系统 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进

舌尖上的蛋炒饭的博客 1015

python多线程、多进程、协程的使用

本文主要介绍多线程、多进程、协程的最常见使用,每个的详细说明与介绍有时间会在以后的随笔中体现。 一、多线程 1.python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。threading通过对thread模块进行二次封装,提供了更方便的API来操作线程。接下来只介绍threading的常见用法。 2.使用 import threading import time def Traversal_5(interval):

qq_40639828的博客 1093

python学习-多线程、多进程、协程

多线程、多进程和协程都是 Python 中实现并发编程的方式。多线程适用于 I/O 密集型任务,多进程适用于 CPU 密集型任务,协程适用于高并发的 I/O 密集型任务。在实际应用中,可以根据具体的需求选择合适的并发编程方式。

wu73guang5jian的博客 699

(7)学习编程---python多进程、多线程、协程

多进程是指一个程序同时运行多个进程。每个进程都有自己的内存空间和资源,进程之间通过进程间通信(IPC)来共享数据。:每个进程都有独立的内存空间,一个进程的崩溃不会影响其他进程。:可以利用多核 CPU 的优势,实现真正的并行计算。:每个进程都有自己的内存空间,因此资源消耗较大。:进程间通信需要通过 IPC,通信成本较高。多线程是指一个进程内部同时运行多个线程。线程共享进程的内存空间,因此线程间的通信成本较低。:线程比进程轻量,创建和销毁的开销较小。:线程共享进程的内存空间,通信成本较低。

m0_56267167的博客 823

python多线程多进程协程_Python多进程,多线程,协程

1、概念以下仅为个人理解进程——在windows的任务管理器里看到的一个个程序就是进程,最常看见的多进程就是浏览器的多进程,一个程序启动后至少会有一个进程,通常为了效率,会给多核CPU每个核分配几个进程以充分利用CPU。进程之间互不影响,一个进程挂了并不会影响另一个进程。线程——一个进程至少会有一个线程,线程是最小的执行单位。一个进程可以有多线程,多线程可以提高效率。一个线程挂了会导致该进程挂了从...

weixin_39863371的博客 199
上一篇: python 闭包 ,装饰器
下一篇: python私有化,import,封装,继承,多态
djs123DJS
博客等级 码龄9年 49粉丝 137原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值