Python线程和线程池

python 多线程与线程池 线程: 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行 并发与并行: 单核CUP执行多任务,由于CUP执行代码都是顺序执行的,当执行多个任务的时候操作系统会轮流让各个任务交替执行,由于执行速度过快,感觉是所有的任务同时执行一样,称为并发,当任务数小于CU 阅读详情

线程和线程池

进程:运行中的程序

线程:一个进程会默认启动一个线程(线程属于进程),这个线程是默认的主线程

线程应用:

  • 驱动程序:让计算机硬件正常工作
  • 操作系统:让硬件之间相互配合,让应用工作
  • 应用程序:提供各种功能的软件,一般运行在操作系统上

线程的实现

标准库:_thread和threading,其中 threading 实现了对 _thread的封装

threading模块中提供了Thread , Lock , RLock , Condition等组件

主线程 : 当一个程序启动时 , 就有一个线程开始运行 , 该线程通常叫做程序的主线程

子线程 : 因为程序是开始时就执行的 , 如果你需要再创建线程 , 那么创建的线程就是这个主线程的子线程

主线程的重要性体现在两方面 :

  1. 是产生其他子线程的线程

  2. 通常它必须最后完成执行比如执行各种关闭操作

Thread类

常用参数说明

参数说明
target表示调用的对象,即子线程要执行的任务
name子线程名称
args传入target函数中的位置参数,是一个元组,参数后必须加逗号

使用如下

#导入包
from threading import Thread
#调用对象
def funa():
    pass

#实例化对象,创建线程
my_thread = Thread(target = funa)
#线程运行
my_thread.start()

常用方法

方法名描述
Thread.run(self)线程启动时运行的方法,由该方法调用target参数所指定的函数
Thread.start(self)启动进程,start方法就是去帮你调用run方法
Thread.terminate(self)强制终止线程
Thread.join(self,timeout=None)阻塞调用,主线程进行等待
Thread.setDaemon(self,daemonic)将子线程设置为守护线程
Thread.getName(self,name)获取线程名称
Thread.setName(self,name)设置线程名称

示例如下

import threading
import time
#定义线程要运行的函数
def funa(name,a):
    #休眠一段时间便于观察
	time.sleep(a)
    print('我是{}'.format(name))

#创建两个线程
my_ti1 = threading.Thread(target=funa,args=('yuxuan',3))
my_ti2 = threading.Thread(target=funa,args=('fashi',4))
#设置守护线程,守护线程需要在启动线程之前设置
my_ti1.Daemon(True)
#如果设置了子线程为守护线程,那么子线程的一切以主线程为主,即如果主线程还杂执行,那么子线程也会继续执行,如果主线程已经执行完毕,即使子线程未执行完毕,子线程也会结束
#启动线程
my_ti1.start()
my_ti2.start()
#线程阻塞,主线程等待子线程my_ti2执行完毕再继续执行
my_ti2.join()
#设置线程名称
my_ti2.setName('jiucheng')
#获得线程名称
my_ti2.getName()

通过继承来实现多线程

import threading
import time
#继承 threading中的Thread类
class MyThread(threading.Thread):
    #参数通过__init__来初始化
    def __init__(self,name):
        super().__init__()
        self.name = name
    #重写run方法,这个是表示线程活动的方法,必须有
	def run(self):
        #以下写上需要实现的方法
        print('my name is {}'.foramt(self.name))
        time.sleep(2)

if __name__ == '__main__':
    #创建线程实例
    my_t1 = MyThread('t1')
    my_t2 = MyThread('t2')
    #启动线程
    my_t1.start()
    my_t2.start()

如果重写的run方法有参数,那么需要通过___init__方法对参数初始化,如果要使用父类的init方法,加上super().__init__()


线程之间的通讯

在多线程中 , 所有变量对于所有线程都是共享的 , 因此 , 线程之间共享数据最大的危险在于多个线程同时修改一个变量 , 那就乱套了 , 所以我们需要互斥锁 , 来锁住数据。

如下示例

import threading
import time
#定义全局变量a
a = 1

#定义线程要运行的函数
def funa():
    #使用全局变量
    global a
    for i in range(1000):
        a+=1
	
def funb():
    #使用全局变量
    global a
    for i in range(1000):
        a+=2
#创建线程
t1 = threading.Thread(target=funa)
t2 = threading.Thread(target=funb)
#启动线程
t1.start()
t2.start()

上述的示例因为没有加线程锁,当两个线程在执行的过程中会产生竞争,从而不确定哪个线程来执行函数。

所以为了避免对全局变量a的修改出现问题,当需要修改数据a时加上锁。

当一个线程正在访问a时,其他线程会等待当前线程对a的访问完毕,并且解锁,然后实行对a的访问。

加锁 lock.acquire

互斥锁:在多线程中 , 所有变量对于所有线程都是共享的 , 因此 , 线程之间共享数据最大的危险在于多个线程同时修改一个变量 , 那就乱套了 , 所以我们需要互斥锁 , 来锁住数据。

所以上述代码改进如下

from threading import Thread,Lock
#定义全局变量a
a = 1
#锁实例化
lock = Lock()

第一种实现

#定义线程要运行的函数
def funa():
    #使用全局变量
    global a
    for i in range(1000):
        #访问a前加锁
        lock.acquire()
        a+=1
        #访问a完毕解锁
        lock.release()
	
def funb():
    #使用全局变量
    global a
    for i in range(1000):
        #访问a前加锁
        lock.acquire()
        a+=2
        #访问a完毕解锁
        lock.release()
#创建线程
t1 = Thread(target=funa)
t2 = Thread(target=funb)
#启动线程
t1.start()
t2.start()
#阻塞主线程
t1.join()
t2.join()

第二种实现

#定义线程要运行的函数
def funa():
    #使用全局变量
    global a
    for i in range(1000):
        #访问a前加锁,with在对a的访问完毕后会自动解锁
        with lock:
        	a+=1
        
	
def funb():
    #使用全局变量
    global a
    for i in range(1000):
        #访问a前加锁,with在对a的访问完毕后会自动解锁
        with lock:
        	a+=2
        
#创建线程
t1 = Thread(target=funa)
t2 = Thread(target=funb)
#启动线程
t1.start()
t2.start()
#阻塞主线程
t1.join()
t2.join()

线程队列

队列的概念:一个入口,一个出口,先入先出(FIFO)(单项队列)

队列需要导包

from queue import Queue

队列常见方法

方法名描述
put(item)入队
get()出队
empty()#近似测试队列是否为空
full()#近似测试队列是否为满
qsize()#近似队列长度
task_done()任务结束
join()等待完成

一个队列的简单实现

from threading import Thread
from queue import Queue
#产生随机数的包
from random import randint

#创建队列对象,队列长度为10
my_q = Queue(10)
#生产数据
def put_Data(my_q):
    for i in range(10):
        #产生0-1000之间的随机数
        num = randin(0,1000)
        #往队列放数据
        my_q.put(num)
#取出数据
def get_Data(my_q):
    for i in range(10):
        #从队列取出数据
        my_q.get()
        
#创建两个线程,分别用来生成数据和取出数据
t1 = Thread(target=put_Data,args=(my_q,))
t2 = Thread(target=get_Data,args=(my_q,))
#线程启动
t1.start()
t2.start()
#阻塞主线程
t1.join()
t2.join()

通过队列一边生产数据,一边取出数据,取数据时不会对数据产生影响,相当于变相实现了锁的功能,因为队列是一边进,一边出,对于没有入队的数据不会取到,所以保证了数据的安全。

from queue import Queue
#产生随机数的包
from random import randint

#创建队列对象,队列长度为10
my_q = Queue(10)
#生产数据
def put_Data(my_q):
    for i in range(10):
        #产生0-1000之间的随机数
        num = randin(0,1000)
        #往队列放数据
        my_q.put(num)


#得到队列有多少数据,并不是队列的总大小
my_q.qsize()
#put相当于一个任务,当put完成时,需要加上task_done(),put一次就需要task_done()一次
my_q.put(1)
my_q.task_done()
#join是检测任务是否完成,例如如果put了10次,但是task_done()只有9次,那么join()会等待最后一个task_done()完成才会执行,否则会产生阻塞
my_q.join()

线程池

若干个线程等待被使用,当需要使用时,去除线程,使用完一个线程,再次放入线程池中,当代下次使用,达到循环使用线程的目的。

主线程: 相当于生产者,只管向线程池提交任务。

​ 并不关心线程池是如何执行任务的。

​ 因此,并不关心是哪一个线程执行的这个任务。

线程池: 相当于消费者,负责接收任务,

​ 并将任务分配到一个空闲的线程中去执行。

一个线程池的简单实现

#导入包,配合队列实现线程池
from threading import Thread
from queue import Queue

class ThreadPool:
    #线程池初始化
    def __init__(self,n):   #n  线程的数量
        self.queue = Queue()  #放任务的队列
        for i in range(n):
            #创建线程,self.worker线程执行的函数,并指定线程为守护线程
            Thread(target=self.worker,daemon=True).start()
    
    #线程执行的函数,即用来执行任务函数的函数
    def worker(self):
        while True:
            #从队列中取任务func表示任务函数,args,kwargs是任务函数的参数
            func,args,kwargs = self.queue.get()
            #任务函数,执行此函数完成一系列功能
            func(*args,**kwargs)
            #任务函数执行完毕,表示队列的get()任务完成,需要task_done()表示任务完成
            self.queue.task_done()
     
    #往队列中放任务函数,参数func 表示任务函数,args和kwargs表示任务函数参数
    def apply_async(self,func,args=(),kwargs={}):
        #往队列中放任务
        self.queue.put((func,args,kwargs))
        
    #用来判断队列中的所有任务是否完成
    #worker中任务函数执行完一次就会task_done(),如果有10次任务,task_done()次数不够10次,那么join不会执行
    def join(self):
        #用来判断队列任务是否执行完毕
        self.queue.join()
    

初始化函数:用来指定线程池内可以使用的线程的数量。

工作函数:从队列中取出任务分配给线程使用,然后执行任务函数,执行完通知队列任务执行完毕。

队列放任务函数:实现往队列中添加任务函数

阻塞函数:等待队列中所有的任务执行完毕,用来判断是否有任务未执行完毕

效果演示

#接上述代码
#任务函数1
def task1():
    time.sleep(2)
    print('任务1完成')
    
#任务函数2
def task1(*args,**kwargs):
    time.sleep(2)
    print('任务2完成',args,kwargs)
    
    
#线程池实例化,2表示有两个线程
my_pool = ThreadPool(2)
#放任务
my_pool.apply_async(task1)
my_pool.apply_async(task2,args=(1,2),kwargs={'name':'jiucheng','age':18})
#任务放置完成
print('任务放置完成')
#判断任务是否执行完成
my_pool.join()
#如果执行完成,会执行以下代码
print('全部任务完成')

python内置线程池

代码演示如下

#导包
from multiprocessing.pool import ThreadPool
import time

#内置线程池实例化,2表示有两个线程
my_pool = ThreadPool(2)
#任务函数1
def task1():
    time.sleep(2)
    print('任务1完成')
    
#任务函数2
def task2(*args,**kwargs):
    time.sleep(2)
    print('任务2完成',args,kwargs)

#放任务
my_pool.apply_async(task1)
my_pool.apply_async(task2,args=(1,2),kwds={'name':'yuxuan','age':15})
#任务放置完成
print('任务放置完成')
#要求,在join前必须要close,表示这样就不允许再提交其他任务了
my_pool.close()
#判断任务是否执行完成
my_pool.join()
#如果执行完成,会执行以下代码
print('全部任务完成')
Python 多线程和线程池 一,前言 进程:是程序,资源集合,进程控制块组成,是最小的资源单位 特点:就对Python而言,可以实现真正的并行效果 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦   线程:是进程中最小的执行单位。 特点无法利用多核,无法实现真正意义上是并行效果。 优点:对于IO密集型的操作可以很好利用IO阻塞的时间 二,GIL(全局解释器锁)   python目前有很多解释器,目前使用最广泛的是CPython,还有PYPY和JPython等解释器,.. 阅读详情

相关推荐

【python内功修炼011】:Python进程池和线程池详解

文章目录一、关于线程池\进程池介绍1.1 池的概念1.2 池的划分1.3 线程池和进程池的区别1.5 进程池的创建(流程)二、创建线程池\进程池的两种方法2.1 concurrent和multiprocessing区别三、concurrent.futures模块3.1 模块的介绍3.2 Executor.submit 创建进程/线程池四、concurrent.futures 常用模块4.1 Exe...

金鞍少年的博客 1106

随笔录--Python多线程和线程池

在一次课设的时候做的随心笔录,现在放在优快云上来记录一下。

Bigbin666的博客 1441

浅析Python自带的线程池和进程池

线程池和进程池是Python中实现并发编程的重要工具,它们可以有效地管理和调度多线程或多进程执行任务,提高程序的性能和响应能力。在选择使用线程池还是进程池时,需要根据具体的应用场景和需求来决定。对于I/O密集型任务,线程池是一个不错的选择;而对于CPU密集型任务,尤其是需要利用多核资源的情况,进程池更为合适。同时,我们也需要注意线程池和进程池在使用中可能遇到的问题,如线程间的竞态条件、进程间的通信开销等,并采取相应的措施来解决这些问题。

这家伙很懒,什么都没有留下 1763

【Python基础编程】深入掌握线程与线程池的高效应用

上篇文章讲述的是python的异常处理和文件读写,这篇文章讲述python的并发编程:线程。Python 中使用线程主要通过threading:创建新线程执行目标函数。start():启动线程。join():等待线程结束。Lock():用于同步线程,避免竞态条件。是一种简单且强大的工具,用于在多线程环境中安全地共享数据。通过Queue,我们可以避免直接管理锁的复杂性,并实现线程安全的数据交换和任务分发。如果你需要处理线程间的数据交换、任务队列,Queue是首选。python 的和threading。

易辰的博客 3184

ST7102驱动移植与调试实战

本文详细介绍了在君正T40平台上移植和调试ST7102 LCD驱动芯片的实战经验。内容涵盖硬件接口配置、时序参数调整、寄存器初始化序列编写及常见问题解决,重点解析了ST7102单芯片集成显示与触控功能的特性,为嵌入式设备显示驱动开发提供实用指南。

k6l7m8n9的博客 1414

2月底速申!国家超算互联网免费算力全攻略|编程小白零消耗实操首测_2026-02-26

2月底速申!国家超算互联网免费算力全攻略|编程小白零消耗实操首测作为一名编程小白,我目前正在学习编译和运行 Qt 框架,也在逐步摸索开发环境的配置方法,目标是打造一款属于自己的个人效率工具。就在这时,我挖到了一个国家级硬核福利:国家超算互联网核心节点开放免费试运行!哪怕是零基础如我,也能申领到 100 卡时异构加速卡算力,关键是——2 月底前申请更稳妥,早占位早使用。

qq_58517981的博客 2108

【计算机网络】多线程\线程池对比(python)

- 线程池是在程序运行开始,创建好的n个线程,并且这n个线程挂起等待任务的到来。而多线程是在任务到来得时候进行创建,然后执行任务。 - 线程池中的线程执行完之后不会回收线程,会继续将线程放在等待队列中;多线程程序在每次任务完成之后会回收该线程。 - 由于线程池中线程是创建好的,所以在效率上相对于多线程会高很多。 - 线程池也在高并发的情况下有着较好的性能;不容易挂掉。多线程在创建线程数较多的情况下,很容易挂掉。

Coco416的博客 1503

告别Link180!在Ansys Mechanical 2020R2中正确启用Cable280绳索单元(附Beta选项开启指南)

本文详细介绍了在Ansys Mechanical 2020R2中启用Cable280绳索单元的全过程,包括Beta选项的开启步骤、建模技巧及高阶应用。Cable280作为专为绳索仿真设计的单元,相比传统的Link180单元,在大变形模拟和计算效率上表现更优,特别适合斜拉桥、电梯牵引绳等工程场景。

weixin_33711647的博客 406

python线程,线程池

线程在一个进程的内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”叫做线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

liangjiao_shou的博客 985

ADS中HB仿真自动优化报错问题解决心得

在ADS HB仿真中自动优化出现报错被强制暂停,解决方法如下

yyyyyyyyyyjy的博客 6541

RK3568 NFS rootfs配置与调试实战指南(已验证)

本文提供了在RK3568开发板上配置NFS rootfs的完整实战指南。通过详细步骤讲解如何配置uboot的bootargs参数、编译支持NFS的内核,并在PC端搭建TFTP与NFS服务器,最终实现从网络挂载根文件系统,从而极大提升驱动调试和应用程序开发的迭代效率。

weixin_29175469的博客 282

Python中多线程和线程池的使用方法

上述代码中,我们定义了一个process函数,它接受一个列表作为参数,对列表中的每个元素进行运算,并将结果保存到另一个列表中。在上面的代码中,我们首先定义了一个GetHtmlThread类,继承自threading.Thread类,然后在类的构造函数中传入需要爬取的URL。在主程序中,我们创建了5个线程,每个线程都执行task函数,并传入不同的参数。但是,这种单线程爬取的方式效率较低,因为在获取HTML代码的时候需要等待响应,而在等待响应的过程中CPU会空闲,无法充分利用计算机的性能。

weixin_47831992的博客 4817

ICC2: pin shape不在track上引起的drc如何解决?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 435

PYTHON线程和线程池

文章目录线程的实现Thread类线程之间的通讯线程队列线程池python内置线程池 进程:运行中的程序 线程:一个进程会默认启动一个线程(线程属于进程),这个线程是默认的主线程 线程应用: 驱动程序:让计算机硬件正常工作 操作系统:让硬件之间相互配合,让应用工作 应用程序:提供各种功能的软件,一般运行在操作系统上 线程的实现 标准库:_thread和threading,其中 threading...

Limit_Fly的博客 813

深度强化学习调参技巧:以DQN、DDPG、TD3、PPO、SAC等算法为例

深度强化学习调参技巧:以D3QN、DDPG、TD3、PPO、SAC算法为例

丨汀、的博客 3444

Python爬虫实战:全自动采集银行理财产品收益率数据

本文通过Playwright动态爬虫技术,成功实现了对银行理财产品收益率数据的实时采集,并通过 Pandas 数据清洗、SQLite 存储、调度自动化等模块,构建了一个可扩展的银行理财数据抓取系统。理财非儿戏,数据做决策。掌握银行收益信息是我们迈向理性投资的第一步。希望这套工具对你有所帮助!

2201_76125261的博客 1156

python进程池和线程池

进程池会预先创建一定数量的进程,任务到来时就将其分配给空闲的进程执行,避免反复创建和销毁进程的开销。进程池的用法:和线程池是一样的;进程池用的是with方法去展示的,也可以用线程池的那种方法是使用,当然线程池的也可以用with方法去使用。如图,由result1结果和result2结果可知,使用submit方法执行任务的顺序是不固定的,使用map方法执行任务的顺序是固定的。如图,由result1结果和result2结果可知,使用submit方法执行任务的顺序和使用map方法执行任务的顺序都是固定的。

leshen_88的博客 1406

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

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

python进程池和线程池_python 之 进程池与线程池

1.什么时候用池?池的功能是限制启动的进程数或线程数。什么时候应该限制?当并发的任务数远远超过了计算机的承受能力时,即无法一次性开启过多的进程数或线程数时就应该用池的概念将开启的进程数或线程数限制在计算机可承受的范围内2.同步 vs 异步同步,异步指的是提交任务的两种方式同步:提交完任务后就在原地等待,直到任务运行完毕后拿到任务的返回值,再继续运行下一行代码异步:提交完任务(绑定一个回调函数)后根...

weixin_39918248的博客 146

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

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

python threading 线程池_python多线程和线程池

在python中,常用的多线程的模块有这么几个_threadthreadingQueue之前有个 thread 模块,被 python3 抛弃了,改名为 _thread。但其实 _thread 也没什么人用,因为 _thread 有的 threading 都有,_thread 没有的 threading 依然有。那么接下来我们就来尝试 threading 吧示例每天得摸 20 条鱼,每隔一秒钟摸一...

weixin_39794130的博客 270

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【python面试宝典7】线程池,模块和包

如果应用程序需要频繁的将任务派发到线程中执行,线程池就是必选项,因为创建和释放线程涉及到大量的系统底层操作,开销较大,如果能够在应用程序工作期间,将创建和释放线程的操作变成预创建和借还操作,将大大减少底层开销。在排序阶段,先读入能放在内存中的数据量,将其排序输出到一个临时文件,依此进行,将待排序数据组织为多个有序的临时文件,然后在归并阶段将这些临时文件组合为一个大的有序文件,这个大的有序文件就是排序的结果。的文件,否则无法导入这个包。就是线程池的实现,如果要弄清楚它的工作原理,可以参考下面的内容。

kaggle expert,全球排名前1000,清华计算机研究生,兴趣算法工程 1234

python队列和线程池

锁能解决变量的共享的问题,但是不常见,锁住别人干嘛,咱们不如来好好的排下队。这样就不会死锁了,其实queue是自带锁。 队列 queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue。python3是小写的queue即可。 在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线...

wulishinian的博客 1177

python 多线程和线程池

1 代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 #coding:utf-8 2 3 #Python的线程池实现 4 5 import Queue 6 import threading 7 ...

dianbu4103的博客 133

python线程池和进程池_Python程序中的进程池和线程池

一、什么是进程池或线程池池:池的是为了限制进程数和线程数什么是时候该用进程池/线程池:当python程序是 计算密集型 且并发的任务量远大于计算机所能承受的范围,无法一次性开启过多的任务数量就应该考虑使用进程池和线程池二、理解同步、异步、同步: 提交了一个任务,必须等任务执行完了,才能执行下一个.无论该任务是否存在阻塞,同步调用都会原地等待,相当于串行异步: 提交了一个任务,可以不用等任务的执行结...

weixin_39845347的博客 296

python进程池和线程池_Python中的进程池和线程池

0.concurrent.futures库之前我们使用多线程(threading)和多进程(multiprocessing)完成常规的需求:在启动的时候start、jon等步骤不能省,复杂的需要还要用1-2个队列。随着需求越来越复杂,如果没有良好的设计和抽象这部分的功能层次,代码量越多调试的难度就越大。有没有什么好的方法把这些步骤抽象一下呢,让我们不关注这些细节,轻装上阵呢?答案是:有的,从Pyt...

weixin_31271165的博客 266

Python多线程和线程池的下载实战用法

多线程——IO密集型,例如文件下载多进程——CPU密集型,例如文件读写。

m0_57021623的博客 1965
上一篇: Makefile中objcopy使用说明
下一篇: PYTHON循环的使用
Limit_Fly
博客等级 码龄9年 31粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值