python线程 验证多线程的执行顺序 验证多线程是否共享全局变量 daemon线程

线程

线程的介绍

在python中, 想要实现多任务除了需要使用进程, 还可以使用线程来完成, 线程是实现大任务的另外一种方式.

线程的概念

线程是进程中执行代码的一个分支, 每个分支(线程) 要想工作执行代码需要cpu 进行调度, 也就是说线程是cpu调度的基本单位, 每个进程至少都有一个线程, 而这个线程就是我们通常说的主线程.

线程类Thread 参数说明

Thread(group,target,name,args,kwargs)

group: 线程组, 默认值为None 一般不使用
target: 执行的目标任务名
args: 元祖传参
kwargs: 字典传参
name: 线程名

线程的使用

import threading
import time


def sing(singer, sname):
	for i in range(5):
		print("%s 正在唱%s"(singer, sname))
		time.sleep(1)


def dance(dancer, dname)
	for i in range(5):
		print("%s 正在跳%s" % (dancer, dname))
		time.sleep(1)


if __name__ = "__main__":
	# 在主线程中创建一个子线程 运行 sing 函数
	# 创建子线程: 1. 创建一个子线程 2.启动子线程的创建运行
	# target 参数指定子线程运行的函数名字(入口)  args 指定位置参数的元祖  kwargs 指定关键字传参
	sing_thd = threading.Thread(target=sing, args("吴亦凡","大碗宽面"))
	sing_thd.start()

	# 在主线程中创建一个子线程 运行 dance 函数
	dance_thd = threading.Thread(target=dance, kwargs={"dancer":"坤坤", "dname": "篮球"})
	dance_thd.start()

	# 等待子线程运行完成
	sing_thd.join()
	dance_thd.join()
	print("厉害厉害")


#  控制台输出
吴亦凡正在唱大碗宽面
坤坤正在跳篮球舞
吴亦凡正在唱大碗宽面
坤坤正在跳篮球舞
坤坤正在跳篮球舞
吴亦凡正在唱大碗宽面
坤坤正在跳篮球舞
吴亦凡正在唱大碗宽面
坤坤正在跳篮球舞
吴亦凡正在唱大碗宽面
厉害厉害

验证多线程的执行顺序

import threading
import time


def func(no):
	for i in range(6):
		time.sleep(1)
		print(no)


if __name__ = "__main__":
	for i in range(5):
		thd = threading.Thread(target=func, args=(i,))
		thd.start()

# 执行是无序的 和操作系统的调度策略有关

验证多线程是否共享全局变量

import threading

g_number = 0


def func():
	global g_number
	g_number += 1000
	print("子线程修改完毕 %s" % g_number)


if __name__ = "__main__"
	# 1. 创建一个子线程 让他去修改全局变量
	thd = threading.Thread(target=func)
	thd.start()

	# 2. 主线程等待子线程退出 再去查看全局变量的结果
	thd.join
	print("全局变量的值是 %d" % g_number)

	# 结论: 主进程和子进程之间 不共享全局变量
	# 独立的数据空间 创建子进程时父进程给子进程拷贝一份数据
	# 结论: 同一个进程内部的多线程是共享全局变量


# 控制台输出
子线程修改完毕 1000
全局变量的值是 1000

daemon线程
假如我们就让主线程执行1秒钟, 子线程就销毁不再执行, 怎么办?
1.我们可以将所有子线程设置为守护线程
守护线程的意义:如果当前整个程序中 全部都是 daemon 线程 那么整体将会退出

设置守护线程的两种方式:

  1. threading.Thread(target=show_info, daemon=True)
  2. 线程对象.setDaemon(True)
import threading
import time


def func1(no):
	for i in range(1000000000):
		time.sleep(1)
		print(no)


def func(no):
	for i in range(6):
		time.sleep(1)
		print(no)


if __name__ == "__main__":
	# 在一个程序中 所有的 daemon 子进程会跟跟随主进程一起停止
	# 在一个进程中 所有的 daemon 子线程会跟随最后一个非 daemon 线程一起停止
	thd = threading.Thread(target=func1, args=("111",), deamon=True)
	# thd.daemon =True
	# thd.setDaemon(true)
	thd.start()

	thd = threading.Thread(target=func, args=("222",))
	thd.start()

	time.sleep(2)
	print("主线程即将运行完成")

小结

  1. 线程执行是无序的
  2. 主线程默认会等待所有子线程结束再结束, 设置守护线程的目的是主线程退出子线程销毁.
  3. 线程之间共享全局变量,好处是可以对全局变量的数据进行共享
  4. 线程之间共享全局变量可能会导致数据出现错误问题, 可以使用线程同步来解决这个问题,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值