问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Python多线程是什么意思?

发布网友 发布时间:2022-04-23 13:02

我来回答

5个回答

懂视网 时间:2022-04-29 16:22

示例1
我们将要请求五个不同的url:
单线程

import time 
import urllib2 
defget_responses(): 
urls=[ 
‘http://www.baidu.com', 
‘http://www.amazon.com', 
‘http://www.ebay.com', 
‘http://www.alibaba.com', 
‘http://www.gxlcms.com' 
 ] 
start=time.time() 
forurlinurls: 
printurl 
resp=urllib2.urlopen(url) 
printresp.getcode() 
print”Elapsed time: %s”%(time.time()-start) 
get_responses()

输出是:
http://www.baidu.com200
http://www.amazon.com200
http://www.ebay.com200
http://www.alibaba.com200
http://www.gxlcms.com200
Elapsed time:3.0814409256

解释:
url顺序的被请求
除非cpu从一个url获得了回应,否则不会去请求下一个url
网络请求会花费较长的时间,所以cpu在等待网络请求的返回时间内一直处于闲置状态。
多线程

import urllib2 
import time 
from threading import Thread 
classGetUrlThread(Thread): 
def__init__(self, url): 
self.url=url 
super(GetUrlThread,self).__init__() 
defrun(self): 
resp=urllib2.urlopen(self.url) 
printself.url, resp.getcode() 
defget_responses(): urls=[ 
‘http://www.baidu.com', 
‘http://www.amazon.com', 
‘http://www.ebay.com', 
‘http://www.alibaba.com', 
‘http://www.gxlcms.com' 
] 
start=time.time() 
threads=[] 
forurlinurls: 
t=GetUrlThread(url) 
threads.append(t) 
t.start() 
fortinthreads: 
t.join() 
print”Elapsed time: %s”%(time.time()-start) 
get_responses()

输出:
http://www.gxlcms.com200
http://www.baidu.com200
http://www.amazon.com200
http://www.alibaba.com200
http://www.ebay.com200
Elapsed time:0.689890861511

解释:

意识到了程序在执行时间上的提升
我们写了一个多线程程序来减少cpu的等待时间,当我们在等待一个线程内的网络请求返回时,这时cpu可以切换到其他线程去进行其他线程内的网络请求。
我们期望一个线程处理一个url,所以实例化线程类的时候我们传了一个url。
线程运行意味着执行类里的run()方法。
无论如何我们想每个线程必须执行run()。
为每个url创建一个线程并且调用start()方法,这告诉了cpu可以执行线程中的run()方法了。
我们希望所有的线程执行完毕的时候再计算花费的时间,所以调用了join()方法。
join()可以通知主线程等待这个线程结束后,才可以执行下一条指令。
每个线程我们都调用了join()方法,所以我们是在所有线程执行完毕后计算的运行时间。

关于线程:

cpu可能不会在调用start()后马上执行run()方法。
你不能确定run()在不同线程建间的执行顺序。
对于单独的一个线程,可以保证run()方法里的语句是按照顺序执行的。
这就是因为线程内的url会首先被请求,然后打印出返回的结果。

实例2

我们将会用一个程序演示一下多线程间的资源竞争,并修复这个问题。

from threading import Thread 
#define a global variable some_var=0 
classIncrementThread(Thread): 
defrun(self): 
#we want to read a global variable 
#and then increment it 
globalsome_var 
read_value=some_var 
print”some_var in %s is %d”%(self.name, read_value) 
some_var=read_value+1 
print”some_var in %s after increment is %d”%(self.name, some_var) 
defuse_increment_thread(): 
threads=[] 
foriinrange(50): 
t=IncrementThread() 
threads.append(t) 
t.start() 
fortinthreads: 
t.join() 
print”After 50 modifications, some_var should have become 50″ 
print”After 50 modifications, some_var is %d”%(some_var,) 
use_increment_thread()

多次运行这个程序,你会看到多种不同的结果。
解释:
有一个全局变量,所有的线程都想修改它。
所有的线程应该在这个全局变量上加 1 。
有50个线程,最后这个数值应该变成50,但是它却没有。
为什么没有达到50?
在some_var是15的时候,线程t1读取了some_var,这个时刻cpu将控制权给了另一个线程t2。
t2线程读到的some_var也是15
t1和t2都把some_var加到16
当时我们期望的是t1 t2两个线程使some_var + 2变成17
在这里就有了资源竞争。
相同的情况也可能发生在其它的线程间,所以出现了最后的结果小于50的情况。
解决资源竞争

from threading 
import Lock, Thread 
lock=Lock() 
some_var=0 
classIncrementThread(Thread): 
defrun(self): 
#we want to read a global variable 
#and then increment it 
globalsome_var 
lock.acquire() 
read_value=some_var 
print”some_var in %s is %d”%(self.name, read_value) 
some_var=read_value+1 
print”some_var in %s after increment is %d”%(self.name, some_var) 
lock.release() 
defuse_increment_thread(): 
threads=[] 
foriinrange(50): 
t=IncrementThread() 
threads.append(t) 
t.start() 
fortinthreads: 
t.join() 
print”After 50 modifications, some_var should have become 50″ 
print”After 50 modifications, some_var is %d”%(some_var,) 
use_increment_thread()

再次运行这个程序,达到了我们预期的结果。
解释:
Lock 用来防止竞争条件
如果在执行一些操作之前,线程t1获得了锁。其他的线程在t1释放Lock之前,不会执行相同的操作
我们想要确定的是一旦线程t1已经读取了some_var,直到t1完成了修改some_var,其他的线程才可以读取some_var
这样读取和修改some_var成了逻辑上的原子操作。
实例3
让我们用一个例子来证明一个线程不能影响其他线程内的变量(非全局变量)。
time.sleep()可以使一个线程挂起,强制线程切换发生。

from threading import Thread 
import time 
classCreateListThread(Thread): 
defrun(self): 
self.entries=[] 
foriinrange(10): 
time.sleep(1) 
self.entries.append(i) 
printself.entries 
defuse_create_list_thread(): 
foriinrange(3): 
t=CreateListThread() 
t.start() 
use_create_list_thread()

运行几次后发现并没有打印出争取的结果。当一个线程正在打印的时候,cpu切换到了另一个线程,所以产生了不正确的结果。我们需要确保print self.entries是个逻辑上的原子操作,以防打印时被其他线程打断。
我们使用了Lock(),来看下边的例子。

from threading import Thread, Lock 
import time 
lock=Lock() 
classCreateListThread(Thread): 
defrun(self): 
self.entries=[] 
foriinrange(10): 
time.sleep(1) 
self.entries.append(i) 
lock.acquire() 
printself.entries 
lock.release() 
defuse_create_list_thread(): 
foriinrange(3): 
t=CreateListThread() 
t.start() 
use_create_list_thread()

这次我们看到了正确的结果。证明了一个线程不可以修改其他线程内部的变量(非全局变量)。

热心网友 时间:2022-04-29 13:30

简单地说就是作为可能是仅有的支持多线程的解释型语言(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部分地实现了变量共享。
再加一条,如果你不知道你的代码到底算CPU密集型还是IO密集型,教你个方法:
multiprocessing这个mole有一个mmy的sub mole,它是基于multithread实现了multiprocessing的API。
假设你使用的是multiprocessing的Pool,是使用多进程实现了concurrency
from multiprocessing import Pool
如果把这个代码改成下面这样,就变成多线程实现concurrency
from multiprocessing.mmy import Pool
两种方式都跑一下,哪个速度快用哪个就行了。
UPDATE:
刚刚才发现concurrent.futures这个东西,包含ThreadPoolExecutor和ProcessPoolExecutor,可能比multiprocessing更简单

热心网友 时间:2022-04-29 14:48

多线程能让你像运行一个独立的程序一样运行一段长代码。这有点像调用子进程(subprocess),不过区别是你调用的是一个函数或者一个类,而不是独立的程序。
程基本上是一个独立执行流程。单个进程可以由多个线程组成。程序中的每个线程都执行特定的任务。例如,当你在电脑上玩游戏时,比如说国际足联,整个游戏是一个单一的过程。,但它由几个线程组成,负责播放音乐、接收用户的输入、同步运行对手等。所有这些都是单独的线程,负责在同一个程序中执行这些不同的任务。
每个进程都有一个始终在运行的线程。这是主线。这个主线程实际上创建子线程对象。子线程也由主线程启动。

热心网友 时间:2022-04-29 16:22

几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,所有运行中的任务都对应一个进程。即当一个程序进入内存运行时,即变成一个进程。进程就是处于运行过程中的程序,并且具有一定的独立功能。进程是系统进行资源分配调度的一个独立单位,当一个程序运行时,内部可能包含多个顺序执流,每个顺序执行流就是一个线程。Python多线程的优势:
1、线程在程序中是独立的,并发的执行流,划分尺度小于进程,所有多线程程序的并发性高;
2、进程在执行过程中拥有独立的内存单元,而多个线程共享内存,可以极大地提高进程程序的运行效率;
3、线程比进程具有更高的性能,由于同一个进程中的线程都有共性,多个线程共享同一个进程的虚拟空间,可以很容易实现通信。操作系统在创建进程中,必须为该进程分配独立内存空间,分配大量相关资源,但创建线程则简单得多。

热心网友 时间:2022-04-29 18:14

什么是线程

线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。

为什么要使用多线程

线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。

因为线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程比进程具有更高的性能,这是由于同一个进程中的线程都有共性多个线程共享同一个进程的虚拟空间。线程共享的环境包括进程代码段、进程的公有数据等,利用这些共享的数据,线程之间很容易实现通信。

操作系统在创建进程时,必须为该进程分配独立的内存空间,并分配大量的相关资源,但创建线程则简单得多。因此,使用多线程来实现并发比使用多进程的性能要高得多。

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

python多线程能提高效率吗

在某些情况下,Python多线程可以提高程序的执行效率。多线程是指在一个程序中同时运行多个线程,每个线程可以执行不同的任务,从而实现并发执行。多线程可以提高效率的情况包括:1、并行任务:如果程序中有多个任务可以并行执行,即它们不会相互阻塞或依赖彼此的结果,那么使用多线程可以同时执行这些任务,从而...

什么是线程(多线程),Python多线程的好处

多线程则扩展了多进程的概念,使得同一个进程可以同时并发处理多个任务。线程(Thread)也被称作轻量级进程(Lightweight Process),线程是进程的执行单元。就像进程在操作系统中的地位一样,线程在程序中是独立的、并发的执行流。当进程被初始化后,主线程就被创建了。对于绝大多数的应用程序来说,通常仅...

Python多线程是什么意思?

简单地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的多线程是有compromise的,在任意时间只有一个Python解释器在解释Python bytecode。UPDATE:如评论指出,Ruby也是有thread支持的,而且至少Ruby MRI是有GIL的。如果你的代码是CPU密集型,多个线程的代码很...

python多线程最多多少

1、python之多线程2、python多线程并发数量控制3、python最大支持多少线程?python之多线程 进程的概念:以一个整体的形式暴露给操作系统管理,里面包含各种资源的调用。 对各种资源管理的集合就可以称为进程。线程的概念:是操作系统能够进行运算调度的最小单位。本质上就是一串指令的集合。进程和线程的区别...

有没有朋友们进来聊聊python的多线程和多进程

python的多线程和多进程 差不多是这样子。多线程目前仅用于网络多线程采集, 以及性能测试。其它的语言也有类似的情况,线程本身的特点导致线程的适用范围是受限的。只有CPU过剩,而其它的任务很慢,此时用线程才是有益的,可以很好平衡等待时间,提高并发性能。线程的问题主要是线程的安全稳定性。线程无法...

Python多线程—threading库使用

线程是操作系统中的最小单位,负责执行程序指令,它在进程内共享资源。线程相较于进程更为轻量,且可以并发执行,提高程序运行效率。在Python中,threading库提供了多线程的支持。创建线程有两种方式:一是定义任务函数,并通过调用start()启动线程;二是定义任务类,继承自threading.Thread,实现自定义线程。

Python多线程—threading库使用

Python多线程:threading库详解在Python中,线程(Thread)作为操作系统调度的基本单元,虽然不具备独立的系统资源,但它是进程内的执行单元,能共享进程资源。线程之间可以并发执行,一个线程可以创建、撤销其他线程,形成进程内的多任务处理。Python的多线程库主要通过threading模块实现。这里有两种常见的创建方式...

python多线程能开多少个(2023年最新整理)

Python多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 程序的运行速度可能加快 在一些等待的任务实现上如用户输入、文件读写和网...

python中多进程和多线程的区别

关于这两者,最经典的一句话就是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,线程是程序中一个单一的顺序控制流程,进程内一个相对独立的、可调度的执行单元,是系统独立调度和分配CPU的基本单位指运行中的程序的调度单位,在单个程序中同时运行多个线程完成不同的工作,称为多线程。进程与...

python之多进程和多线程详解

在Python中,理解进程和线程的关键在于它们在CPU资源分配上的区别。进程是CPU的最小工作单元,增加线程不会直接提升进程的CPU优先级,而是通过提高同一进程内线程的执行效率,即在该进程的使用时间段内提高资源利用率。线程的优先级是可以用户自定义的。并发和并行是两个概念。并发指同一时刻多个程序在CPU上...

多线程是什么意思 多线程处理是什么意思 多线程任务是什么意思 多线程下载是什么意思 多线程工作什么意思 多线程倍率什么意思 三线程是什么意思 多线程是什么 什么是多线程并发
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
三菱PLC换刀报警是什么原因? 求"无论……都……"的三种用法,并举例 我的手机装了管家后,别人打电话都提示关机,卸载,重装,恢复出厂设置都没... word图片怎么设置环绕方式? 找一些重生成动物的小说 古文里哪个字表示爱 微信一键删除僵尸粉软件2.2破解版下载介绍_微信一键删除僵尸粉软件2.2... 中国历史上著名的画家有哪些 我国历史上著名画家哪些 中国古代有哪些画家 中国古代画家都有哪些 为什么重要的压缩圆柱螺旋弹簧的支承圈要并紧和磨平? UG NX6.0中怎么画弹簧两端的支承圈部分? Python爬虫多线程如何使用多线程 弹簧圈的治疗步骤 如何确定弹簧的有效圈数 python爬虫怎么实现多线程 弹簧的螺距是什么 python爬虫如何利用多线程 有口弹簧圈如何撑开 python可以多线程爬虫吗 弹簧的支撑圈数问题 弹簧圈数多少有什么区别 各种类型弹簧有效圈数的详细计算方法 什么是弹簧的有效圈数/支撑圈数和总圈数 弹簧的支撑圈数是多少? 可以变色的唇膏,听说过吗?千人千色,不沾杯、不脱妆。 男生可以用变色润唇膏吗? 你知道尿酸是什么吗?该如何治疗尿酸? 如果一个女人,让人感觉不到任何的安全感,完全感觉不到她是否真心,什么时候是真什么时候是假,怎么办? 请问什么叫尿酸? 大家知道常用的弹簧参数有哪些吗? Python 多线程爬虫如何优雅的退出 已知弹簧线径螺距和高度求圈数 python多线程爬虫,每个线程都循环requests,线程数目过多会不会导致req... 弹簧并圈长度是什么意思,什么是弹簧并圈呢 Python使用多线程爬取网页时,如果服务器设置了线程限制怎么办呢?_百 ... python爬虫多线程假死怎么解决 弹簧的间距,节距,螺距,是什么 为什么有人说Python的多线程是鸡肋? 弹簧的有效圈数怎么看啊 python多线程爬取文件,怎么设置超时重连 弹簧参数 “热敷”是什么意思? python 多线程 访问网站 热敷的好处和坏处 热敷有哪些方法? 为什么说python的多线程是鸡肋 母亲节送男朋友的妈妈什么礼物合适? python多个线程锁可提高效率吗 热敷的方法有哪些?