python高级之多任务编程

1、多任务编程–线程

1) 多任务的介绍

<1> 多任务概念:在同一时间内执行多个任务,每个任务可以理解成现实生活中干的活

<2> 并发:指的是任务多余的cpu核数,通过操作系统的各种调度算法,实现用多个任务一起执行
 <3> 并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的

2)多任务的介绍

<1> 线程的概念:线程就是在程序运行过程中的一个分支,每次运行的程序至少都有一个线程

<2> 单线程执行

例:from time import sleep  # 导入模块

		# 唱歌
		def sing():
		    for i in range(3):
		        print("正在唱歌...%d" % i)
		        sleep(1)

		# 跳舞
		def dance():
		    for i in range(3):
		        print("正在跳舞...%d" % i)
		        sleep(1)

		if __name__ == '__main__':
		    sing() #唱歌
		    dance() #跳舞

		运行结果如下:
		正在唱歌...0
		正在唱歌...1
		正在唱歌...2
		正在唱歌...0
		正在唱歌...1
		正在唱歌...2

<3> 多线程执行

#导入线程模块
	 import threading

<4> 线程类Thread参数说明

Thread([group [, target [, name [, args [, kwargs]]]]])
	 group: 线程组,目前只能使用None
	 target: 执行的目标任务名
	  args: 以元组的方式给执行任务传参
	  kwargs: 以字典方式给执行任务传参
	  name: 线程名,一般不用设置

<5> 启动线程

使用start可以启动线程

<6> 使用多线程完成多任务的代码例题

import threading
		import time

		# 唱歌任务
		def sing():
		    # 扩展: 获取当前线程
		    # print("sing当前执行的线程为:", threading.current_thread())
		    for i in range(3):
		        print("正在唱歌...%d" % i)
		        time.sleep(1)

		# 跳舞任务
		def dance():
		    # 扩展: 获取当前线程
		    # print("dance当前执行的线程为:", threading.current_thread())
		    for i in range(3):
		        print("正在跳舞...%d" % i)
		        time.sleep(1)


		if __name__ == '__main__':
		    # 扩展: 获取当前线程
		    # print("当前执行的线程为:", threading.current_thread())
		    # 创建唱歌的线程
		    # target: 线程执行的函数名
		    sing_thread = threading.Thread(target=sing)

		    # 创建跳舞的线程
		    dance_thread = threading.Thread(target=dance)

		    # 开启线程
		    sing_thread.start()
		    dance_thread.start()

		  执行结果:
		  		正在唱歌...0
		  		正在跳舞...0
		  		正在唱歌...1
		  		正在跳舞...1
		  		正在唱歌...2
		  		正在跳舞...2

3) 线程的注意点

1、线程之间执行时无序的
		例:
			import threading
			import time


			def task():
			    time.sleep(1)
			    print("当前线程:", threading.current_thread().name)


			if __name__ == '__main__':

			   for _ in range(5):
			       sub_thread = threading.Thread(target=task)
			       sub_thread.start()

		执行结果:
				当前线程: Thread-3
				当前线程: Thread-2
				当前线程: Thread-4
				当前线程: Thread-1
				当前线程: Thread-5

	2、主线程等待所有的子程序解释后才结束
		import threading
		import time


		# 测试主线程是否会等待子线程执行完成以后程序再退出
		def show_info():
		    for i in range(5):
		        print("test:", i)
		        time.sleep(0.5)


		if __name__ == '__main__':
		    sub_thread = threading.Thread(target=show_info)
		    sub_thread.start()

		    # 主线程延时1秒
		    time.sleep(1)
		    print("over")

	3、守护程序
		例:
			import threading
			import time


			# 测试主线程是否会等待子线程执行完成以后程序再退出
			def show_info():
			    for i in range(5):
			        print("test:", i)
			        time.sleep(0.5)


			if __name__ == '__main__':
			    # 创建子线程守护主线程 
			    # daemon=True 守护主线程
			    # 守护主线程方式1
			    sub_thread = threading.Thread(target=show_info, daemon=True)
			    # 设置成为守护主线程,主线程退出后子线程直接销毁不再执行子线程的代码
			    # 守护主线程方式2
			    # sub_thread.setDaemon(True)
			    sub_thread.start()

			    # 主线程延时1秒
			    time.sleep(1)
			    print("over")

	4、总结
		1)线程之间执行时是无序的
		2)主线程会等待所有的子程序结束后才会结束,如果需要可以设置守护主线程