首页技术python多线程,python3.11

python多线程,python3.11

编程之家2026-06-29700次浏览

大家好,今天小编来为大家解答python多线程这个问题,python3.11很多人还不知道,现在让我们一起来看看吧!

python多线程,python3.11

Python多线程是什么意思

简单地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的多线程是有compromise的,在任意时间只有一个Python解释器在解释Python bytecode。

UPDATE:如评论指出,Ruby也是有thread支持的,而且至少Ruby MRI是有GIL的。

如果你的代码是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有context switch

但是:如果你的代码是IO密集型,多线程可以明显提高效率。例如制作爬虫(我就不明白为什么Python总和爬虫联系在一起…不过也只想起来这个例子…),绝大多数时间爬虫是在等待socket返回数据。这个时候C代码里是有release GIL的,最终结果是某个线程等待IO的时候其他线程可以继续执行。

反过来讲:你就不应该用Python写CPU密集型的代码…效率摆在那里…

如果确实需要在CPU密集型的代码里用concurrent,就去用multiprocessing库。这个库是基于multi process实现了类multi thread的API接口,并且用pickle部分地实现了变量共享。

python多线程,python3.11

再加一条,如果你不知道你的代码到底算CPU密集型还是IO密集型,教你个方法:

multiprocessing这个module有一个dummy的sub module,它是基于multithread实现了multiprocessing的API。

假设你使用的是multiprocessing的Pool,是使用多进程实现了concurrency

from multiprocessing import Pool

如果把这个代码改成下面这样,就变成多线程实现concurrency

from multiprocessing.dummy import Pool

python多线程,python3.11

两种方式都跑一下,哪个速度快用哪个就行了。

UPDATE:

刚刚才发现concurrent.futures这个东西,包含ThreadPoolExecutor和ProcessPoolExecutor,可能比multiprocessing更简单

python多线程的几种方法

Python进阶(二十六)-多线程实现同步的四种方式

临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区。

锁机制

threading的Lock类,用该类的acquire函数进行加锁,用realease函数进行解锁

import threadingimport timeclass Num:

def __init__(self):

self.num= 0

self.lock= threading.Lock() def add(self):

self.lock.acquire()#加锁,锁住相应的资源

self.num+= 1

num= self.num

self.lock.release()#解锁,离开该资源

return num

n= Num()class jdThread(threading.Thread):

def __init__(self,item):

threading.Thread.__init__(self)

self.item= item def run(self):

time.sleep(2)

value= n.add()#将num加1,并输出原来的数据和+1之后的数据

print(self.item,value)for item in range(5):

t= jdThread(item)

t.start()

t.join()#使线程一个一个执行12345678910111213141516171819202122232425262728

当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“同步阻塞”(参见多线程的基本概念)。

直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。

信号量

信号量也提供acquire方法和release方法,每当调用acquire方法的时候,如果内部计数器大于0,则将其减1,如果内部计数器等于0,则会阻塞该线程,知道有线程调用了release方法将内部计数器更新到大于1位置。

import threadingimport timeclass Num:

def __init__(self):

self.num= 0

self.sem= threading.Semaphore(value= 3)#允许最多三个线程同时访问资源

def add(self):

self.sem.acquire()#内部计数器减1

self.num+= 1

num= self.num

self.sem.release()#内部计数器加1

return num

n= Num()class jdThread(threading.Thread):

def __init__(self,item):

threading.Thread.__init__(self)

self.item= item def run(self):

time.sleep(2)

value= n.add()

print(self.item,value)for item in range(100):

python多线程作用

总结起来,使用多线程编程具有如下几个优点:

进程之间不能共享内存,但线程之间共享内存非常容易。

操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。因此,使用多线程来实现多任务并发执行比使用多进程的效率高。

Python语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了 Python的多线程编程。

在实际应用中,多线程是非常有用的。比如一个浏览器必须能同时下载多张图片;一个 Web服务器必须能同时响应多个用户请求;图形用户界面(GUI)应用也需要启动单独的线程,从主机环境中收集用户界面事件……总之,多线程在实际编程中的应用是非常广泛的。

好了,文章到此结束,希望可以帮助到大家。

四种常见的软件开发模型(七种常见数据分析模型)c语言电子书下载,c语言教材