Python——网络编程(三) 进程与线程
1. 一个程序至少有一个进程,一个进程至少有一个线程(进程可以理解成线程的容器)。
2. 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。
但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
3. 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调
度的一个独立单位,是分配资源的基本单位,也是最小单位。
4. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程
自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈)但是
它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
5. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。
#threading模块
- 由更底层的thread模块开发而来
#简单开多线程,实现了并发
1 import threading 2 import time 3 4 def func(x): 5 print(x) 6 time.sleep(3) 7 8 if __name__ == '__main__': 9 10 #主线程运行到这里创建了两个子线程 11 t1 = threading.Thread(target=func, args=(1, )) 12 t2 = threading.Thread(target=func, args=(2, )) 13 #两个子线程开始运行 14 t1.start() 15 t2.start() 16 #主线程继续执行 17 print('End')
#join: 对子线程的父线程进行阻塞,直到指定子线程运行完毕
1 import threading 2 import time 3 4 def func1(x): 5 print(x) 6 time.sleep(3) 7 print('%s end' %x) 8 9 def func2(x): 10 print(x) 11 time.sleep(5) 12 print('%s end' %x) 13 14 if __name__ == '__main__': 15 16 t1 = threading.Thread(target=func1, args=('target1', )) 17 t2 = threading.Thread(target=func2, args=('target2', )) 18 t1.start() 19 t2.start() 20 21 t1.join() 22 t2.join() 23 24 print('End')
#setDaemon 守护线程
线程划分为用户线程和后台(daemon)线程(又叫守护线程)
当我们 在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程 就分兵两路,分别运行。
那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出,即:
1) 用户线程将会继续运行
2) 如果没有用户线程,都是后台进程的话,那么程序执行完毕
但是有时候我们需要的是 只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法
setDaemon可以将线程设置为后台进程
注意:
- setDaemon需要在start方法调用之前使用
其他方法:
# run(): 线程被cpu调度后自动执行线程对象的run方法 # start():启动线程活动。 # isAlive(): 返回线程是否活动的。 # getName(): 返回线程名。 # setName(): 设置线程名。 threading模块提供的一些方法: # threading.currentThread(): 返回当前的线程变量。 # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
#利用继承的方式调用threading
class MyThread(threading.Thread): def __init__(self, num): #如果需要添加变量则需要自定义init函数,并且需要继承父类的init方法 threading.Thread.__init__(self) self.num = num #需要重写run方法,在线程被cpu调度后自动执行run() def run(self): print('start thread %s' %self.num) time.sleep(3) if __name__ == '__main__': t1 = MyThread(1) t2 = MyThread(2) t1.start() t2.start() print('ending')

浙公网安备 33010602011771号