python中,每个进程有GIL锁,导致每个进程同一时刻只能有一个线程出来执行
threading模块
import threading import time def foo(x): print("--------%s" %x) time.sleep(3) t1=threading.Thread(target=foo,args=(2,)) #创建线程对象; 任务,参数,元组形式 t1.start() # 启动 print("ending")
join
阻塞主线程,等待线程结束后再继续执行主线程
import threading import time def foo(x): print("--------%s" %x) time.sleep(3) def bar(n): print("--------%s" %n) time.sleep(5) s = time.time() t1=threading.Thread(target=foo,args=(2,)) #创建线程对象; 任务,参数,元组形式 t1.start() # 启动 t2=threading.Thread(target=bar,args=(5,)) #创建线程对象; 任务,参数,元组形式 t2.start() # 启动 t1.join() t2.join() print("ending") print(time.time() - s) # --------2 # --------5 # ending # 5.001526832580566
不开多线程的运行时间
import threading import time def foo(x): print("--------%s" %x) time.sleep(3) def bar(n): print("--------%s" %n) time.sleep(5) s = time.time() foo(2) bar(5) print("ending") print(time.time() - s) # --------2 # --------5 # ending # 8.000638246536255
setDaemon(True) 守护线程
将线程声明为守护线程,必须在start()
方法调用之前设置,如果不设置为守护线程程序会被无限挂起。
当我们在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程
就分兵两路,分别运行,那么当主线程完成
想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是只要主线程
完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以
用setDaemon方法啦
当daemon设置为true时,如果主线程退出,那么子线程也将跟着退出,反之,子线程将继续运行,直到正常退出
import threading import time def foo(x): time.sleep(3) print("--------%s" % x) def bar(n): time.sleep(5) print("--------%s" % n) s = time.time() t1=threading.Thread(target=foo,args=(2,)) #创建线程对象; 任务,参数,元组形式 # t1.setDaemon(True) t1.start() # 启动 t2=threading.Thread(target=bar,args=(5,)) #创建线程对象; 任务,参数,元组形式 t2.setDaemon(True) t2.start() # 启动 print("ending") print(time.time() - s) # ending # 0.0010097026824951172 # --------2
Thread实例对象的方法 # isAlive(): 返回线程是否活动的。 # getName(): 返回线程名。 # setName(): 设置线程名。 threading模块提供的一些方法: # threading.currentThread(): 返回当前的线程变量。 # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
==================
计算密集型和IO密集型
IO密集:
程序中存在大量的IO操作
计算密集:
程序中存在大量计算操作(非IO操作)
对于计算密集型,多线程还不如顺序执行;GIL锁只能出来一个线程,多个线程只能切换执行,这样对于计算密集型效率就会变低
对于IO密集型,对于IO阻塞时,切换执行其他线程,这样就节省了阻塞的时间,效率就会高
结论:对于python而言,同一进程下,无法利用多核优势,多线程处理IO密集型任务时,具有优势,对于处理计算密集型的任务,不推荐使用