进程(process):相当于一个程序要运行时所需的所有资源的集合,相当于一个车间,不工作
两个进程之间的数据不共享,完全不独立,互相不能访问。
线程(thread):一道单一指令的控制流,寄生在进程中,相当于车间中的工人,工作。一个进程至少需要一个线程,这个线程为主线程,一个进程中可以有多个线程。
cpu的核数越多,代表可以并发的线程越多
一个进程中的不同线程共享数据,多线程在修改同一个数据时,一定要加锁
___线程___
1、threading模块
声明一个线程:t=threading.Thread(target=线程函数名,args=(参数,))
启动一个线程:t.start()
1 import threading 2 def func1(n): 3 print('thread:%s'%n) 4 t=threading.Thread(target=func1,args=(i,)) 5 t.start()
2、实现多线程并发
即同时启动多个线程,并发运行
import threading import time def func1(n): time.sleep(8) #为了更直观的感受到并发效果~~ print('thread:%s'%n) for i in range(30): #同时启动30个线程,并发 t=threading.Thread(target=func1,args=(i,)) t.start()
3、线程的其他小方法
t.getName():取线程名 ,该名称是唯一的
t.setName('sefjsjfisojgiod') :设置线程名字,如果不设置,系统会自动起名
threading.active_count() :当前活跃的线程数
threading.current_thread():当前运行的线程实例
1 import threading 2 import time 3 def run(n): 4 time.sleep(3) 5 print('thread',n) 6 print(threading.current_thread()) #打印当前运行的线程的实例 7 for i in range(10): 8 t=threading.Thread(target=run,args=(i,)) 9 t.start() 10 t.setName('kasjdjakldjalsjdlasjdlsd%s'%i) #修改线程的名字,默认是Thread-i 11 print(t.getName()) #获取线程名,线程名是唯一的 12 print(threading.active_count()) #统计活跃的线程数
4、线程等待
前面程序运行的时候,都是主线程启动和子线程之后,和子线程一起运行,那么如何实现主线程启动了子线程之后先不运行,等待子线程运行完毕之后(比如有些场景需要主线程拿到子线程的结果)再运行呢?????
线程等待:t.join()
1 import threading 2 import time 3 4 def run(n): 5 time.sleep(1) 6 print('thread',n) 7 t_list=[] 8 for i in range(10): 9 t=threading.Thread(target=run,args=(i,)) 10 t.start() 11 t_list.append(t) #将启动的线程加入到有个列表中 12 for t in t_list: 13 t.join() # 等待所有线程运行完毕 14 print('))))))))))))))))))))))))))))))))))))))))')
注意:如果将t.join()加载t.start()之后,那么就不是并行运行了,变成了串行
5、守护线程
前面主线程执行完毕,未执行的子线程仍继续执行,并不受主线程的影响,有些场景主线程完毕之后,子线程变没有意义了,那么如何让主线程执行完毕之后,子线程也停止执行,程序退出呢???
场景举例:ftpserver为主线程,一个子线程的功能是断开很久没有活跃的连接,比如半小时这个连接没有活动,就将该链接断开。该子线程是一个独立的线程,如果主线程已经退出了,那么该子线程也没有存在的意义了。 怎么实现该子线程在主线程断开之后也停止运行呢???? 将该子线程设置为主线程的守护线程就可以啦~~~
t.setDaemon()
1 import threading 2 import time 3 def run(n): 4 time.sleep(1) 5 print('thread:%s'%n) 6 for i in range(10): 7 t=threading.Thread(target=run,args=(1,)) 8 t.setDaemon(True) # 启动线程之前,将线程设置为守护进程,则主线程结束后,子线程也结束,不会继续执行 9 t.start() 10 11 print('hahhhahahahaha')