1.一个程序至少有一个进程,一个进程至少有一个线程,进程可以理解成线程的容器。
2.进程在执行中拥有独立的内存单元,而多个线程共享内存,从而极大提高了程序的运行xiaol。
3.线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口,顺序执行序列和程序的出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个现场执行控制。
4.进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是cpu调度和分配的基本单元,他是比进程更小的能独立运行的基本单位,线程自己基本上不用有系统资源,只拥有一点在运行中必不可少的资源(程序计数器,寄存器和栈),但是他可与同属一个进程的其它线程共享进程所拥有的全部资源。
一个线程可以创建和撤销另一个线程:同一个进程中的多个线程之间可以并发执行
物联你启动多少个线程,你有多少个cpu,Python在执行的时候会淡定的在同一时刻只允许一个线程运行
import threading
import time
def Hi(num):
print("hello %d \n"%num)
time.sleep(2)
print("%s--- over\n" %num)
if __name__ == "__main__":
t1 = threading.Thread(target = Hi,args = (10,))
t1.start()
t2 = threading.Thread(target = Hi,args = (9,))
t2.start()
print("end.....")
join:
join方法是通过调用线程的wait方法来达到同步的目的的。例如,A线程中调用了B线程的join方法,则相当于A线程调用了B线程的wait方法,在调用了B线程的wait方法后,A线程就会进入阻塞状态
import threading
import time
def Hi(num):
print("hello %d \n"%num)
time.sleep(3)
print("%s --stop\n"%num)
def Hello(num):
print("hello %d \n"%num)
time.sleep(5)
print("%s --stop\n"%num)
if __name__ == "__main__":
t1 = threading.Thread(target = Hi,args = (10,))
t2 = threading.Thread(target = Hello,args = (9,))
t1.start()
t1.join() #等t1执行完再往下走,串行
t2.start()
t2.join() #等t2执行完再往下走,串行
print("end.....")
setDaemon:
将线程声明为守护线程,必须在start()方法调用之前设置,如果不设置为守护线程会被无限挂起。这个方法基本和join相反,当我们在程序运行中,执行一个主线程,如果主线程又创建了一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待线程完成后再退出。但是有时候我们需要的是只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可用setDaemon方法
import threading
import time
def hello(name):
print("i am %s"%name)
time.sleep(3)
print("%s stop thread")
if __name__ == "__main__":
t1 = threading.Thread(target = hello ,args = ("lian",))
t2=threading.Thread(target = hello ,args = ("zong",))
threads = []
threads.append(t1)
threads.append(t2)
#t1.setDaemon(True)
for t in threads:
t.setDaemon(True) # 守护线程,跟着主线程一起退----- 注意:一定在start之前设置
t.start()
print("over-----")
- 实例方法有:
run:用一表示线程活动的方法
start:启动线程活动
isAlive:返回线程是否活动
getName:返回线程名
setName:设置线程名
- threading模块提供的一些方法:
threading.currentThread():返回当前线程
threading.enumerate():返回一个包含正在运行的线程的list。正在运行指线程启动后,结束前,不包括启动前和终止后的线程
threading.activeCount():返回正在运行的线程数量,与len(threading.enumerate())有相同效果
import threading
import time
def hello(name):
print("i am %s"%name)
time.sleep(3)
print("%s stop thread")
if __name__ == "__main__":
t1 = threading.Thread(target = hello ,args = ("lian",))
t2=threading.Thread(target = hello ,args = ("zong",))
threads = []
threads.append(t1)
threads.append(t2)
#t1.setDaemon(True)
for t in threads:
# t.setDaemon(True) # 守护线程,跟着主线程一起退----- 注意:一定在start之前设置
t.start()
t.setName("lian-"+t.getName())
print("thread--name:"+t.getName())
print("thread is alive %s:"%t.isAlive())
print("thread num is :%s"%threading.active_count())
print("thread current is :",threading.currentThread())
print("thread list is :",threading.enumerate())
while threading.active_count() ==1:
print("over")
- 自定义线程
类继承threading.Thread,重写run方法
import threading
import time
class MyThread(threading.Thread):
def __init__(self,num):
threading.Thread.__init__(self)
self.num = num
def run(self): #定义每个线程要运行的函数
print("running on number :%s"%self.num)
time.sleep(3)
if __name__ == "__main__":
#线程调用的第二种方式:
t1=MyThread(1)
t1.start()