python并发编程线程(threading模块)
一 threading模块介绍
multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍, 相关知识点可以看这里
二 开启线程的两种方式#方式一 from threading import Thread import time def sayhi(name): time.sleep(2) print("%s say hello" %name) if __name__ == "__main__": t=Thread(target=sayhi,args=("tiga",)) t.start() print("主线程") #方式二 from threading import Thread import time class Sayhi(Thread): def __init__(self,name): super().__init__() self.name=name def run(self): time.sleep(2) print("%s say hello" % self.name) if __name__ == "__main__": t = Sayhi("tiga") t.start() print("主线程")在一个进程下开启多个线程与在一个进程下开启多个子进程的区别
1.谁的开启速度快 from threading import Thread from multiprocessing import Process import os def work(): print("hello") if __name__ == "__main__": #在主进程下开启线程 t=Thread(target=work) t.start() print("主线程/主进程") """ 打印结果: hello 主线程/主进程 """ #在主进程下开启子进程 t=Process(target=work) t.start() print("主线程/主进程") """ 打印结果: 主线程/主进程 hello """
2.瞅一瞅pid from threading import Thread from multiprocessing import Process import os def work(): print("hello", os.getpid()) if __name__ == "__main__": # part1:在主进程下开启多个线程,每个线程都跟主进程的pid一样 t1 = Thread(target=work) t2 = Thread(target=work) t1.start() t2.start() print("主线程/主进程pid", os.getpid()) # part2:开多个进程,每个进程都有不同的pid p1 = Process(target=work) p2 = Process(target=work) p1.start() p2.start() print("主线程/主进程pid", os.getpid()) """ hello 26316 hello 26316 主线程/主进程pid 26316 主线程/主进程pid 26316 hello 26318 hello 26319 """
3.同一进程内的线程共享该进程的数据? from threading import Thread from multiprocessing import Process import os def work(): global n n=0 if __name__ == "__main__": # n=100 # p=Process(target=work) # p.start() # p.join() # print("主",n) #毫无疑问子进程p已经将自己的全局的n改成了0,但改的仅仅是它自己的,查看父进程的n仍然为100 n=1 t=Thread(target=work) t.start() t.join() print("主",n) #查看结果为0,因为同一进程内的线程之间共享进程内的数据线程相关的其他方法Thread实例对象的方法 # isAlive(): 返回线程是否活动的。 # getName(): 返回线程名。 # setName(): 设置线程名。 threading模块提供的一些方法: # threading.currentThread(): 返回当前的线程变量。 # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。from threading import Thread import threading from multiprocessing import Process import os def work(): import time time.sleep(3) print(threading.current_thread().getName()) if __name__ == "__main__": #在主进程下开启线程 t=Thread(target=work) t.start() print(threading.current_thread().getName()) print(threading.current_thread()) #主线程 print(threading.enumerate()) #连同主线程在内有两个运行的线程 print(threading.active_count()) print("主线程/主进程") """ 打印结果: MainThread <_MainThread(MainThread, started 140735268892672)> [<_MainThread(MainThread, started 140735268892672)>, ] 主线程/主进程 Thread-1 """
主线程等待子线程结束 from threading import Thread import time def sayhi(name): time.sleep(2) print("%s say hello" %name) if __name__ == "__main__": t=Thread(target=sayhi,args=("egon",)) t.start() t.join() print("主线程") print(t.is_alive()) """ egon say hello 主线程 False """