# python线程模块的选择
#python提供了几个用于多线程编程的模块,包括thread、threading和Queue等。
# thread和threading模块允许程序员创建和管理线程。
# thread模块提供了基本的线程和锁的而支持,threading提供了更高级别、功能更强的线程管理功能
# Queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构
# 避免使用thread模块,因为更高级别的threading模块更为先进,对线程的支持更为完善,而且使用thread模块里的属性有可能会与threading出现冲突
# 其次低级别的thread模块的同步原语很少(实际上只有一个),而threading有很多。
# thread模块中当主线程结束时,所有的线程都会被强制关掉,没有警告也不会有正常的清除工作,至少threading模块能确保重要的子线程退出后进程才退出
# thread模块不支持守护线程,当主线程退出时,所有的子线程不论他们是否还在工作,都会被强行退出。
## threading模块支持守护线程,守护线程一般时一个等待客户请求的服务器,如果没有客户提出请求它就在那等着。
# 如果设定一个线程为守护线程,就表示这个线程是不重要的,在进程退出的时候,不用等待这个线程退出
#多线程并发的实验. 每个线程都结束了,主进程才会结束
# import time
# from threading import Thread
#
#
# def func(n):
# time.sleep(1)
# print(n)
#
# for i in range(10):
# t = Thread(target=func, args=(i, )) # 创建线程对象,绑定子线程函数func,传递参数。 类似进程的操作
# t.start()
# print('主线程执行完了')
# #多线程并发的实验. 自定义类启动线程的方法
# import time
# from threading import Thread
#
# class MyTread(Thread):
# def __init__(self, arg): # 想要接收参数,需要重写init,并且将父类的属性继承过来
# super().__init__()
# self.arg = arg
#
# def run(self):
# time.sleep(1)
# print(self.arg)
#
# t = MyTread(5)
# t.start()
# print(22)
# t.join() # 如果不执行这个,主线程会继续向下执行,主线程执行完了后程序不会退出,必须等待所有子线程执行结束程序才会退出。有了这句话会阻塞在这里等待子线程结束
# print('子线程执行完毕了')
# 同一个进程的多线程之间数据是共享的,子线程修改了当前进程的全局变量
import time
from threading import Thread
def func(n):
global g
g = 0
time.sleep(1)
print(g)
g = 100
t_lst = []
for i in range(10):
t = Thread(target=func, args=(i, )) # 创建线程对象,绑定子线程函数func,传递参数。 类似进程的操作
t_lst.append(t)
t.start()
for t in t_lst:
t.join()