python 线程初识

#线程生成
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 ")
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值