目录
- 线程:
- 每个进程有一个地址空间,而且默认就有一个控制线程
- 一条流水线工作的过程 , 而一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一条流水线
- 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。
- 多线程(即多个控制线程)的概念是,在一个进程中存在多个线程,多个线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源
- 同一个进程内的多个线程共享该进程内的地址资源
- 创建线程的开销要远小于创建进程的开销
- 在主进程下开启多个线程,每个线程都跟主进程的pid一样
- 开多个进程,每个进程都有不同的pid
- 进程之间地址空间是隔离的
- 同一进程内开启的多个线程是共享该进程地址空间的
- 同一进程内的线程之间共享进程内的数据
线程:
-
每个进程有一个地址空间,而且默认就有一个控制线程
-
一条流水线工作的过程 , 而一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一条流水线
-
进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。
-
多线程(即多个控制线程)的概念是,在一个进程中存在多个线程,多个线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源
-
同一个进程内的多个线程共享该进程内的地址资源
-
创建线程的开销要远小于创建进程的开销
from threading import Thread
import time
def sayhi(name):
time.sleep(2)
print(f'{name} say hello')
if __name__ == '__main__':
t = Thread(target = sayhi,args= ('nick',))
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(f'{self.name} say hello')
if __name__ == '__main__':
t= Sayhi('nick')
t.start()
print('主线程')
-
在主进程下开启多个线程,每个线程都跟主进程的pid一样
-
开多个进程,每个进程都有不同的pid
-
进程之间地址空间是隔离的
-
同一进程内开启的多个线程是共享该进程地址空间的
-
同一进程内的线程之间共享进程内的数据
Thread实例对象的方法
# isAlive(): 返回线程是否活动的。
# getName(): 返回线程名。
# setName(): 设置线程名。
threading模块提供的一些方法:
# threading.currentThread(): 返回当前的线程变量。
# threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
# threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
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
守护线程:
-
无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁
-
运行完毕并非终止运行
-
1、主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,`
-
2、主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。`
from threading import Thread
import time
def sayhi(name):
time.sleep(2)
print(f'{name} say hello')
if __name__ =='__main__':
t = Thread(target = sayhi,args =('nick',))
t.setDaemon(True)
t.start()
print('主线程')
print(t.is_alive)
主线程
True