#线程生成
import threading,time
#方法1
def say(n):
time.sleep(5)
print("hello,%s"%n)
# t1=threading.Thread(target=say,args=("xu",))
# t1.start()
# t2=threading.Thread(target=say,args=("x",))
# t2.run()#注意start是开始一个线程,而run方法只是函数的一个普通方法的调用
res=[]
start_time=time.time()
for i in range(50):#循环生成线程
t=threading.Thread(target=say,args=("%s"%i,))
t.setDaemon(True)#把当前线程设置为守护线程,可以看到结果,程序只等非守护进程执行完就退出。
t.start()
# t.join()#等待每一个线程的执行结果,后再生成下一个线程执行
#t.join()
res.append(t)
# for t in res:
# print(threading.active_count())#查看有多少个线程还在
# t.join()
end_time=time.time()
print("运行时间",abs(start_time-end_time))
print(threading.current_thread())#打印当前,可以看出主线主线程是程序本身
#方法2:
class OurThread (threading.Thread):#类的写法,要继承threading.Thread
def __init__(self ,n):#重修构造函数
super(OurThread,self).__init__()#继承父类的构造函数
self.n=n
def run(self):#这里只能用run
print("这里只能用run",self.n)
t3=OurThread("jing")
t3.run()#两种调用方法
t3.start()
# # import threading,time
# # def run(n):
# # global num
# # # time.sleep(2)
# # num+=1
# # num=0
# # for i in range(10000):
# # t=threading.Thread(target=run,args=(","))
# # t.start()
# # print(num)
GIL 就是假线程,只能执行一个,而不是真正的多线程 线程锁 在python2.x上,为了避免线程运算出错,需要在每个线程上加一个锁,然后释放。保证只有这个线程额能修改数据 递归锁 在加几个锁的情况下,为了避免解锁出错,所以建立一个一一对应的关系,就叫递归锁
#信号量:就是一次可以执行多少个线程
import threading,time,random
semaphore=threading.BoundedSemaphore(5)#申明被绑定的线程数
def run(n):
semaphore.acquire()#线程锁
print("ok"+" "+n)
time.sleep(a)
semaphore.release()#解锁
for i in range(132):
t=threading.Thread(target=run,args=(str(i),))
a = random.randrange(0, 5)
t.start()
while threading.active_count()!=1:#这里就是等待最后一个子线程执行完,就剩主线程一个
pass
else:
print("---all done ")