1.开启线程的两种方式: 进程,线程: 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合)而线程才是cpu上的执行单位) 1.同一个进程内的多个线程共享该进程内的地址资源 2.创建线程的开销远小于创建进程的开销(创建一个进程,就是创建一个车间,涉及到申请空间, 而且在该空间内建至少一条流水线,但创建线程,就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小)
1 # 方式1: 2 from threading import Thread 3 import time 4 5 def sayhi(name): 6 time.sleep(2) 7 print('%s say hello'%name) 8 9 if __name__ == "__main__":10 t=Thread(target=sayhi,args=('alice',))11 t.start()12 print('主线程') # 一个进程,一个主线程,开启了一个线程13 14 # 方式2:15 from threading import Thread16 import time17 18 class Sayhi(Thread):19 def __init__(self,name):20 super().__init__()21 self.name = name22 23 def run(self):24 time.sleep(2)25 print('%s say hello'%self.name)26 27 if __name__ == "__main__":28 t = Sayhi('alice')29 t.start()30 print('主线程')
2.进程与线程的区别: 1.开进程的开销远大于开线程 2.同一进程内的多个线程共享该进程的地址空间 3.瞅一眼pid
1 # 1. 2 import time 3 from threading import Thread 4 from multiprocessing import Process 5 6 def piao(name): 7 print('%s piaoing' %name) 8 time.sleep(2) 9 print('%s piao end' %name)10 11 if __name__ == '__main__':12 # p1=Process(target=piao,args=('egon',))13 # p1.start() # 发出去后,没有立刻反应 开进程开销大14 15 t1=Thread(target=piao,args=('egon',))16 t1.start() # 发出去后,立刻就反应了,开线程开销小17 18 print('主线程')19 """20 主线程21 egon piaoing22 egon piao end23 """24 """25 egon piaoing26 主线程27 egon piao end28 """29 # 2.30 from threading import Thread31 from multiprocessing import Process32 33 n=10034 def task():35 global n36 n=037 38 if __name__ == '__main__':39 # p1=Process(target=task)40 # p1.start()41 # p1.join() # 彼此隔离的 n = 10042 43 t1=Thread(target=task)44 t1.start()45 t1.join() # 共享地址空间 n = 046 47 print('主线程',n)48 """49 主线程 100 50 """51 """52 主线程 0 53 """54 # 3.55 from threading import Thread56 from multiprocessing import Process,current_process57 import os58 59 def task():60 print(current_process().pid)61 print(os.getpid(),os.getppid())62 63 if __name__ == '__main__':64 # p1=Process(target=task)65 # p1.start() # pid 不一样66 # p1.join()67 68 t1=Thread(target=task)69 t1.start() # 线程pid 一样70 t1.join()71 72 print('主线程',current_process().pid)73 print('主线程',os.getpid(),os.getppid())74 """75 3878076 38780 4316877 主线程 4316878 主线程 43168 1248079 """80 """81 5891282 58912 1248083 主线程 5891284 主线程 58912 1248085 """
3.Thread对象的其他属性或方法: currentThread().getName() t.setName() t.is_alive() t.isAlive() t.join() active_count() enumerate()
1 from threading import Thread,currentThread,active_count,enumerate 2 import time 3 4 def task(): 5 print('%s is running'%currentThread().getName()) 6 time.sleep(2) 7 print('%s is done'%currentThread().getName()) 8 9 if __name__ == "__main__":10 t = Thread(target=task,name='子线程1')11 t.start()12 # t.join()13 # print(t.getName())14 # t.setName('儿子线程1')15 # currentThread().setName('主进程')16 # print(t.is_alive())17 # print(t.isAlive())18 # print('主线程:',currentThread().getName())19 t.join()20 # print(active_count()) # 2 没有join 1 有join21 print(enumerate()) # [<_MainThread(MainThread, started 41144)>]22 23 24 """25 Thread-1 is running26 Thread-127 主线程 MainThread28 Thread-1 is done29 """30 """31 子线程1 is running32 子线程133 主线程 MainThread34 子线程1 is done35 """36 """37 子线程1 is running38 主线程 MainThread39 儿子线程1 is done40 """41 """42 子线程1 is running43 主线程: 主进程44 子线程1 is done45 """46 """47 子线程1 is running48 子线程1 is done49 False50 False51 主线程: MainThread52 """
4.守护线程: 一个进程什么时候被销毁, 1.不开线程,代码完毕,该进程就被销毁 2.主线程等到所有子线程死了后,他才死 守护线程等到所有的子线程死了后,他才死
1 from threading import Thread 2 import time 3 4 def sayhi(name): 5 time.sleep(2) 6 print('%s say hello' %name) 7 8 if __name__ == '__main__': 9 t=Thread(target=sayhi,args=('egon',))10 # t.setDaemon(True) #必须在t.start()之前设置11 t.daemon=True12 t.start()13 14 print('主线程')15 print(t.is_alive()) # t 跟着死了 一个线程内没有开启非守护线程16 """17 主线程18 True19 """20 21 from threading import Thread22 import time23 24 def foo():25 print(123)26 time.sleep(4)27 print("end123")28 29 def bar():30 print(456)31 time.sleep(3)32 print("end456")33 34 if __name__ == '__main__':35 t1=Thread(target=foo)36 t2=Thread(target=bar)37 38 t1.daemon=True39 t1.start()40 t2.start()41 print("main-------")42 """43 123 foo time.sleep(1)44 45645 main-------46 end12347 end45648 """49 """50 123 foo time.sleep(4)51 45652 main-------53 end45654 """