目录
1、并发与并行
并行:两个或多个事件在同一时刻(同一时间点)发生
并发:两个或多个事件在同一时间段发生
并行指的多个cpu,并发主要针对一个cpu
并发的目的是充分利用服务器的每一个核,以达到最高处理性能

2、多线程编程
2-1多线程的实现
2-1-1实例化Thread
例1:
from threading import Thread
import time
def sleep_task(sleep_time):
print("start spleep {}s".format(sleep_time))
time.sleep(3)
print("end spleep {}s".format(sleep_time))
if __name__ == '__main__':
t1 = Thread(target=sleep_task,args=(3,))
t2 = Thread(target=sleep_task,args=(2,))
t1.start()
t2.start()
print("main end")
结果如下:
start spleep 3s
start spleep 2s
main end
end spleep 3s
end spleep 2s
需要注意的是:
1、在实例化的过程中,参数target的值为方法名, 如target=sleep_task,而非target=sleep_task()。
2、在实例化的过程中,参数args的值所需格式为Iterable。如int类型的3,放在元组中需写为(3,)。
知识点:
当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束。
2-1-2继承Thread
from threading import Thread
import time
class sleepThrad(Thread):
def __init__(self,sleep_time):
self.sleep_time = sleep_time
super().__init__()#子类调用父类的__init__()方法进行必要的初始化
def run(self):
print("sleep {} seconds start".format(self.sleep_time))
time.sleep(self.sleep_time)
print("sleep {} seconds end".format(self.sleep_time))
if __name__ == '__main__':
t1 = sleepThrad(2)
t2 = sleepThrad(3)
t1.start()
t2.start()
print("main end")
结果如下:
start spleep 3s
start spleep 2s
main end
end spleep 3s
end spleep 2s
2-2 join()方法
join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程再终止。
如下例子:
from threading import Thread
import time
def sleep_task(sleep_time):
print("start spleep {}s".format(sleep_time))
time.sleep(3)
print("end spleep {}s".format(sleep_time))
if __name__ == '__main__':
t1 = Thread(target=sleep_task,args=(3,))
t2 = Thread(target=sleep_task,args=(2,))
t1.start()
t2.start()
t1.join()
t2.join()
print("main end")
输入结果为:
start spleep 3s
start spleep 2s
end spleep 3s
end spleep 2s
main end
2-3setDaemon(True)
当我们使用setDaemon(True)方法,设置子线程为守护线程时,主线程一旦执行结束,则全部线程全部被终止执行,可能出现的情况就是,子线程的任务还没有完全执行结束,就被迫停止。例子如下:
from threading import Thread
import time
def sleep_task(sleep_time):
print("start spleep {}s".format(sleep_time))
time.sleep(3)
print("end spleep {}s".format(sleep_time))
if __name__ == '__main__':
t1 = Thread(target=sleep_task,args=(3,))
t2 = Thread(target=sleep_task,args=(2,))
t2.setDaemon(True)
t1.start()
t2.start()
print("main end")
结果如下:
start spleep 3s
start spleep 2s
main end
end spleep 3s
注意请确保setDaemon()在start()之前。
本文深入探讨了并发与并行的概念,详细讲解了Python中多线程编程的实现方式,包括通过实例化Thread类和继承Thread类创建线程,以及join()方法和setDaemon()方法的使用,帮助读者理解如何有效利用多线程提高程序性能。
1442

被折叠的 条评论
为什么被折叠?



