python 线程
线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。
threading模块提供的类:
Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local。
threading 模块提供的常用方法:
threading.currentThread(): 返回当前的线程变量。
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
threading 模块提供的常量:
threading.TIMEOUT_MAX 设置threading全局超时时间。
Thread类:
Thread是线程类,有两种使用方法,直接传入要运行的方法或从Thread继承并覆盖run():
方法一: import time import random from threading import Thread def piao(name): print('%s piaoing' %name) time.sleep(random.randrange(1,5)) print('%s piao end' %name) if __name__ == '__main__': t1=Thread(target=piao,args=('egon',)) t1.start() print('主线程') # import time import random from threading import Thread 方法二: class MyThread(Thread): def __init__(self,name): super().__init__() self.name=name def run(self): print('%s piaoing' %self.name) time.sleep(random.randrange(1,5)) print('%s piao end' %self.name) if __name__ == '__main__': t1=MyThread('egon') t1.start() print('主')
好处
-
(1)易于调度。
-
(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
-
(3)开销少。创建线程比创建进程要快,所需开销很少
2、进程的基本状态及状态之间的关系
状态:运行、阻塞、挂起阻塞、就绪、挂起就绪
状态之间的转换:
-
(1)准备就绪的进程,被CPU调度执行,变成运行态;
-
(2)运行中的进程,进行I/O请求或者不能得到所请求的资源,变成阻塞态;
-
(3)运行中的进程,进程执行完毕(或时间片已到),变成就绪态;
-
(4)将阻塞态的进程挂起,变成挂起阻塞态,当导致进程阻塞的I/O操作在用户重启进程前完成(称之为唤醒),挂起阻塞态变成挂起就绪态,当用户在I/O操作结束之前重启进程,挂起阻塞态变成阻塞态;
-
(5)将就绪(或运行)中的进程挂起,变成挂起就绪态,当该进程恢复之后,挂起就绪态变成就绪态;
3、线程和进程的关系以及区别?
** 进程和线程的关系:**
-
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
-
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
-
(3)处理机分给线程,即真正在处理机上运行的是线程
-
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体.
进程与线程的区别:
-
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
-
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
-
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
-
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
从程序上反映区别:
# 1、开进程的开销远大于开线程 import time from threading import Thread from multiprocessing import Process def piao(name): print('%s piaoing' %name) time.sleep(2) print('%s piao end' %name) if __name__ == '__main__': # p1=Process(target=piao,args=('egon',)) # p1.start() t1=Thread(target=piao,args=('egon',)) t1.start() print('主线程')
# 2、同一进程内的多个线程共享该进程的地址空间,而进程的地址内存是相互隔离的 from threading import Thread from multiprocessing import Process n=100 def task(): global n n=0 if __name__ == '__main__': # p1=Process(target=task,) # p1.start() # p1.join() t1=Thread(target=task,) t1.start() t1.join() print('主线程',n)