您当前的位置:首页 > 今日分享头条 > 正文

什么叫多线程下载?python多线程几种方法实现

线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,一个线程不能访问另外一个线程的栈变量,一个进程至少包括一个线程,多线程下载技术就是使用多个连接分别下载软件不同部分的下载方式,第三列是被进程中的线程所占用的CPU时间百分比,如果一个线程开始运行,并输出原来的数据和+1之后的数据print(self.item,value)for item in range(5):t = jdThread(item)t.start()t.join()#使线程一个一个执行12345678910111213141516171819202122232425262728当一个线程调用锁的acquire()方法获得锁时,这四种状态为:初始态:一个线程调用了new方法之后。

什么叫多线程下载

简单地说,多线程下载技术就是使用多个连接分别下载软件不同部分的下载方式。多线程下载技术最大的优点就是能够充分地利用调制解调器的数据传输能力,从而达到在最短的时间内将一个软件下载过来的目的。通常可供下载软件的服务器分配给每个连接的数据带宽是一定的,如果这个带宽比调制解调器的带宽大,那么单个的连接也能够满足调制解调器的数据接收需求而使下载速度达到最大。但是实际上,服务器分配给每个连接的带宽通常要小于调制解调器的数据吞吐能力,因此常常出现宽路跑单车的现象。虽然调制解调器的数据接收指示灯是亮着的,但是实际上传进来的数据流密度却很小。如果把单线程下载比作采用单车运货,那么多线程下载工具就相当于一个车队。开始下载过程以后,这个车队的每台车装载软件的不同部分,然后同时往回开。由于调制解调器提供的路足够宽,所以这些车能够并排地开回来,这样跑一回就可以将软件全部装回来了。从实际过程来看,既然服务器分配给每个连接的带宽是有限的,那么我争取几个连接来下载同一个软件的不同部分,就相当于扩大了下载过程所能够使用的带宽。所以,多线程下载节省的时间常常以几倍计,具体表现就是下载的速度相当快。例如网络蚂蚁的最新版本,采用5个线程、使用56K调制解调器来下载,在不限制数据流量的情况下,通常能够达到7K每秒的下载速度。也许大家会认为,网络蚂蚁所使用的多线程技术简直就是多线程下载技术的极致了,其实不然。这种多线程下载技术离真正的多线程下载技术的极点还有一段距离呢!通过简单的分析就不难明白这一点。网络蚂蚁的多线程都是针对同一个服务器的,确定了下载链接指向的服务器并建立了连接以后,几只蚂蚁到软件所在的同一个服务器上分别去拥抱要下载的软件的不同部分,然后再往用户的计算机中拖。这种下载方式有一个致命的弱点,就是一旦这个目标服务器出现繁忙,那么无论是几只蚂蚁,其工作都将受到影响,导致整个下载速度变慢。网络蚂蚁使用的这种多线程技术实际上是一种单目标的多线程技术。真正高级的多线程下载技术,是从不同的服务器上下载同一个软件的不同部分,这种多线程技术可以称为多目标多线程技术。采用这种最新的多线程下载技术,即使众多的目标服务器中以一个或者几个临时遇到繁忙,其余的服务器依旧能够提供较高的下载速度,而当速度较快的线程结束下载的时候,原来繁忙的服务器就可能空闲下来,这时相应的线程就可以充分利用调制解调器已经变得宽裕的带宽资源高速下载。显然,多目标多线程下载技术要比但目标多线程下载技术在档次上高一个级别,在实际使用中更便于保证提供较高的下载速度。

python多线程几种方法实现

Python进阶(二十六)-多线程实现同步的四种方式临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区。锁机制threading的Lock类,用该类的acquire函数进行加锁,用realease函数进行解锁import threadingimport timeclass Num:def __init__(self):self.num = 0self.lock = threading.Lock() def add(self):self.lock.acquire()#加锁,锁住相应的资源self.num += 1num = self.numself.lock.release()#解锁,离开该资源return numn = 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 = 0self.sem = threading.Semaphore(value = 3) #允许最多三个线程同时访问资源def add(self):self.sem.acquire()#内部计数器减1self.num += 1num = self.numself.sem.release()#内部计数器加1return numn = 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):

什么是进程什么是线程他们之间有什么关系

什么是系统进程进程是指在系统中正在运行的一个应用程序;线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元。对于操作系统而言,其调度单元是线程。一个进程至少包括一个线程,通常将该线程称为主线程。一个进程从主线程的执行开始进而创建一个或多个附加线程,就是所谓基于多线程的多任务。那进程与线程的区别到底是什么?进程是执行程序的实例。例如,当你运行记事本程序(Nodepad)时,你就创建了一个用来容纳组成Notepad.exe的代码及其所需调用动态链接库的进程。每个进程均运行在其专用且受保护的地址空间内。因此,如果你同时运行记事本的两个拷贝,该程序正在使用的数据在各自实例中是彼此独立的。在记事本的一个拷贝中将无法看到该程序的第二个实例打开的数据。以沙箱为例进行阐述。一个进程就好比一个沙箱。线程就如同沙箱中的孩子们。孩子们在沙箱子中跑来跑去,并且可能将沙子攘到别的孩子眼中,他们会互相踢打或撕咬。但是,这些沙箱略有不同之处就在于每个沙箱完全由墙壁和顶棚封闭起来,无论箱中的孩子如何狠命地攘沙,他们也不会影响到其它沙箱中的其他孩子。因此,每个进程就象一个被保护起来的沙箱。未经许可,无人可以进出。实际上线程运行而进程不运行。两个进程彼此获得专用数据或内存的唯一途径就是通过协议来共享内存块。这是一种协作策略。下面让我们分析一下任务管理器里的进程选项卡。这里的进程是指一系列进程,这些进程是由它们所运行的可执行程序实例来识别的,这就是进程选项卡中的第一列给出了映射名称的原因。请注意,这里并没有进程名称列。进程并不拥有独立于其所归属实例的映射名称。换言之,如果你运行5个记事本拷贝,你将会看到5个称为Notepad.exe的进程。它们是如何彼此区别的呢?其中一种方式是通过它们的进程ID,因为每个进程都拥有其独一无二的编码。该进程ID由WindowsNT或Windows2000生成,并可以循环使用。因此,进程ID将不会越编越大,它们能够得到循环利用。第三列是被进程中的线程所占用的CPU时间百分比。它不是CPU的编号,而是被进程占用的CPU时间百分比。此时我的系统基本上是空闲的。尽管系统看上去每一秒左右都只使用一小部分CPU时间,但该系统空闲进程仍旧耗用了大约99%的CPU时间。第四列,CPU时间,是CPU被进程中的线程累计占用的小时、分钟及秒数。请注意,我对进程中的线程使用占用一词。这并不一定意味着那就是进程已耗用的CPU时间总和,因为,如我们一会儿将看到的,NT计时的方式是,当特定的时钟间隔激发时,无论谁恰巧处于当前的线程中,它都将计算到CPU周期之内。通常情况下,在大多数NT系统中,时钟以10毫秒的间隔运行。每10毫秒NT的心脏就跳动一下。有一些驱动程序代码片段运行并显示谁是当前的线程。让我们将CPU时间的最后10毫秒记在它的帐上。因此,如果一个线程开始运行,并在持续运行8毫秒后完成,接着,第二个线程开始运行并持续了2毫秒,这时,时钟激发,请猜一猜这整整10毫秒的时钟周期到底记在了哪个线程的帐上?答案是第二个线程。因此,NT中存在一些固有的不准确性,而NT恰是以这种方式进行计时,实际情况也如是,大多数32位操作系统中都存在一个基于间隔的计时机制。请记住这一点,因为,有时当你观察线程所耗用的CPU总和时,会出现尽管该线程或许看上去已运行过数十万次,但其CPU时间占用量却可能是零或非常短暂的现象,那么,上述解释便是原因所在。上述也就是我们在任务管理器的进程选项卡中所能看到的基本信息列。什么是线程?究竟什么是线程呢?正如在图A中所示,一个线程是给定的指令的序列(你所编写的代码),一个栈(在给定的方法中定义的变量),以及一些共享数据(类一级的变量)。线程也可以从全局类中访问静态数据。栈以及可能的一些共享数据每个线程有其自己的堆栈和程序计数器(PC)。你可以把程序计数器(PC)设想为用于跟踪线程正在执行的指令,而堆栈用于跟踪线程的上下文,上下文是当线程执行到某处时,当前的局部变量的值。虽然你可以编写出在线程之间传送数据的子程序,在正常情况下,一个线程不能访问另外一个线程的栈变量。一个线程必须处于如下四种可能的状态之一,这四种状态为:初始态:一个线程调用了new方法之后,并在调用start方法之前的所处状态。在初始态中,可以调用start和stop方法。Runnable:一旦线程调用了start方法,线程就转到Runnable状态,注意,如果线程处于Runnable状态,它也有可能不在运行,这是因为还有优先级和调度问题。阻塞/NonRunnable:线程处于阻塞/NonRunnable状态,这是由两种可能性造成的:要么是因挂起而暂停的,要么是由于某些原因而阻塞的,例如包括等待IO请求的完成。退出:线程转到退出状态,这有两种可能性,要么是run方法执行结束,要么是调用了stop方法。最后一个概念就是线程的优先级,线程可以设定优先级,高优先级的线程可以安排在低优先级线程之前完成。一个应用程序可以通过使用线程中的方法setPriority(int),来设置线程的优先级大小。

什么是多线程技术在VB 中如何使用

vb6可以实现多线程,不过比较麻烦,vb.net完全支持多线程,请参见msdn.至于vb6实现多线程请看CreateThread这个API函数.以下有详细方案:用VB写多线程程序用到的第一个API函数是CreateThread,这个函数的声明如下: Private Declare Function CreateThread Lib “kernel32“ (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long)As Long 这个函数的返回值是线程的句柄,它的参数含义如下: 1.lpThreadAttributes:这个参数表明函数的返回句柄是否可被子进程继承,如果可被继承,则指向一个SECURITY_ATTRIBUTES的结构,否则设为vbnull。 2.dwStackSize:这个参数设置线程的堆栈大小。 3.lpStartAddress:这个参数指明这个线程函数的起始地址。 4.lpParameter:这个参数是传给线程函数的参数。 5.dwCreationFlags:这个参数设置当线程创建时的初始状态,挂起,运行等等。 6.lpThreadId:这个参数是待创建线程的ID号。 假设创建一个管理线程的类clsThreads,用类的一个公用函数Initialize来初始化线程,用ResumeThread和SuspendThread函数来激活线程,实现代码如下: Private Type udtThread Handle As Long Enabled As Boolean End Type Private uThread As udtThread Private Const CREATE_SUSPENDED As Long = &H4 Private Declare Function CreateThread Lib “kernel32“ (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long Private Declare Function ResumeThread Lib “kernel32“ (ByVal hThread As Long) As Long Private Declare Function SuspendThread Lib “kernel32“ (ByVal hThread As Long) As Long Private Declare Function TerminateThread Lib “kernel32“ (ByVal hThread As Long, ByVal dwExitCode As Long) As Long Public Sub Initialize(ByVal lpfnBasFunc As Long) ’初始化线程 Dim lStackSize As Long, lCreationFlags As Long, lpThreadId As Long, lNull As Long On Error Resume Next lNull = 0 ’创建一个空指针 lStackSize = 0 ’0表示用exe的stack size lCreationFlags = CREATE_SUSPENDED ’表示初始化后先不激活,让别人来激活 uThread.Handle = CreateThread(lNull, lStackSize, lpfnBasFunc, lNull, lCreationFlags, lpThreadId) If uThread.Handle = lNull Then MsgBox “Create thread failed!“ End Sub Public Property Get Enabled() As Boolean On Error Resume Next Enabled = uThread.Enabled End Property Public Property Let Enabled(ByVal vNewValue As Boolean) On Error Resume Next If vNewValue And (Not uThread.Enabled) Then ResumeThread uThread.Handle ’激活线程 uThread.Enabled = True ElseIf uThread.Enabled Then SuspendThread uThread.Handle uThread.Enabled = False End If End Property Private Sub Class_Terminate() ’终止线程 On Error Resume Next Call TerminateThread(uThread.Handle, 0) End Sub 以上内容在类模块clsThreads中,有了它就可以在窗体中实现多线程了。下面以一个简单的例子来说明如何创建多线程(以2个线程为例)。 在form1中添加picture1和picture2两个图片框,以及一个command1按钮,在工程中添加一个bas模块,该模块的代码如下: Option Explicit Private Declare Function GetTickCount Lib “kernel32“ () As Long Public Sub FlickerTop() Static BgColor As Long Dim lTick As Long, lCounter As Long On Error Resume Next For lCounter = 0 To 60000 BgColor = lCounter Mod 256 Form1.Picture1.BackColor = RGB(BgColor, 0, 0) ’变化图片框的颜色 lTick = GetTickCount While GetTickCount - lTick 《 10 ’延迟10个毫秒时间 Wend Next End Sub Public Sub FlickerBottom() Static BgColor As Long Dim lTick As Long, lCounter As Long On Error Resume Next For lCounter = 0 To 60000 BgColor = lCounter Mod 256 Form1.Picture2.BackColor = RGB(0, BgColor, 0) lTick = GetTickCount While GetTickCount - lTick 《 10 Wend Next End Sub 最后在form1中用下面的代码来创建两个线程, Option Explicit Public myThreadTop As New clsThreads, myThreadBottom As New clsThreads Private Sub Command1_Click() On Error Resume Next With myThreadTop .Initialize AddressOf FlickerTop .Enabled = True End With With myThreadBottom .Initialize AddressOf FlickerBottom .Enabled = True End With MsgBox “看看会有什么...“ Set myThreadTop = Nothing Set myThreadBottom = Nothing End Sub


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 洗衣机 消毒(洗衣机怎么除菌消毒)

下一篇: 国内品牌电磁炉排行榜(电磁炉十大品牌排名)



推荐阅读