• python第五十一天----线程,Event,队列


    进程与线程的区别:

    线程==指令集,进程==资源集  (线程集)

    1、同一个进程中的线程共享内存空间,进程与进程之间是独立的

    2、同一个进程中的线程是可以直接通讯交流的,进程与间通讯必需通过一个中间的代理才能实现

    3、创建线程简单,创建进程,是克隆父进程 

    4、一个线程可以控制和操作同一进程里的其他线程,但进程只能操作子进程

    5、线程启动速度快,进程启动速度比较慢

    线程示例:

     1 import time ,threading
     2 
     3 def run(attr):
     4     print('输出:',attr)
     5     time.sleep(3)
     6 
     7 
     8 t1=threading.Thread(target=run,args=('第一个线程',))
     9 t2=threading.Thread(target=run,args=('第二个线程',))
    10 
    11 t1.start()#启动线程1
    12 t2.start()#启动线程2
    1 def run2(attr):
    2     print('输出:',attr)
    3     time.sleep(3)
    4 
    5 run2('第一个线程')
    6 run2('第二个线程')
    7 #以上转为串联执行

    继承线程 类写线程

     1 #!usr/bin/env python
     2 #-*-coding:utf-8-*-
     3 # Author calmyan
     4 
     5 import threading,time
     6 
     7 class thre(threading.Thread):#继承线程中的类
     8     def __init__(self,n,times):
     9         super(thre,self).__init__()
    10         self.n=n
    11         self.teims=times
    12     def run(self):
    13         print('执行第一线程:',self.n)
    14         time.sleep(self.teims)
    15 
    16 star_time=time.time()
    17 t1=thre('第一线程',3)
    18 t2=thre('第二线程',4)
    19 t1.start()
    20 t2.start()
    21 t1.join()#join等待该线程执行完成
    22 
    23 t2.join()
    24 den_time=time.time()-star_time
    25 print(den_time)

    等待线程执行完成,用.join

     1 import time ,threading
     2 lock=threading.Lock()#定义一个线程锁变量
     3 def run(attr):
     4     lock.acquire()#申请一个线程锁
     5     global num
     6     print('输出:',attr)
     7     #time.sleep(3)
     8     num+=1
     9     lock.release()#释放线程锁
    10     time.sleep(3)
    11     print('输出完成'.center(10,''))
    12 star_time=time.time()#开始时间
    13 
    14 num=0
    15 re_lilst=[]#定义一个列表
    16 for i in range(50):
    17     t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程
    18     #t1.setDaemon(True)#设置为守护进程 当主线程完成,守护也停止
    19     t1.start()#起动线程
    20     re_lilst.append(t1)#不用JOIN,避免阻塞为串行
    21 
    22 print(threading.current_thread(),threading.active_count())#查看线程 的主 子  活跃线程
    23     #print('分线程'.center(40,'☆'))
    24 print('数字:',num)
    25 for i in re_lilst:#等待线程 完成
    26     i.join()
    27 print('数字:',num)
    28 print('主线程'.center(60,''),threading.current_thread(),threading.active_count())
    29 
    30 den_time=time.time()-star_time#总共时间
    31 print(den_time)
    View Code

    守护进程,相当于主进程的下属,当主进程结束,无论守护进程内的是否执行完成,都会停止!

     1 import time ,threading
     2 lock=threading.Lock()#定义一个线程锁变量
     3 def run(attr):
     4     lock.acquire()#申请一个线程锁
     5     global num
     6     print('输出:',attr)
     7 
     8     #time.sleep(3)
     9     num+=1
    10     lock.release()#释放线程锁
    11     time.sleep(3)
    12     print('输出完成'.center(10,''))
    13 
    14 star_time=time.time()#开始时间
    15 
    16 num=0
    17 re_lilst=[]#定义一个列表
    18 for i in range(50):
    19     t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程
    20     t1.setDaemon(True)#设置为守护进程 当主线程完成,守护也停止
    21     t1.start()#起动线程
    22     re_lilst.append(t1)#不用JOIN,避免阻塞为串行
    23 
    24 print(threading.current_thread(),threading.active_count())#查看线程 的主 子  活跃线程
    25     #print('分线程'.center(40,'☆'))
    26 print('数字:',num)
    27 # for i in re_lilst:#等待线程 完成
    28 #    i.join()
    29 print('数字:',num)
    30 print('主线程'.center(60,''),threading.current_thread(),threading.active_count())
    31 
    32 den_time=time.time()-star_time#总共时间
    33 print(den_time)
    View Code

    线程锁,在py3中可以不使用:

    lock=threading.Lock()

    lock.acquire()

    递归锁  用于递归线程

     1 import time ,threading
     2 
     3 def run(i):
     4     print('输出:-------',i)
     5     lock.acquire()#申请锁
     6     global num1
     7     num1+=1
     8     time.sleep(0.1)
     9     lock.release()#释放锁
    10     return num1
    11 
    12 def run2(i):
    13     lock.acquire()#申请锁
    14     global num2
    15     print('输出:22',i)
    16     num2+=1
    17     time.sleep(0.1)
    18     lock.release()#释放锁
    19     return num2
    20 
    21 def run3(i):
    22     lock.acquire()#申请锁
    23     res=run(i)
    24     print('输出:333',i)
    25     res2=run2(i)
    26     time.sleep(0.1)
    27     print(res,res2)
    28     lock.release()#释放锁
    29 
    30 
    31 if __name__ == '__main__':
    32     star_time=time.time()#开始时间
    33     num1,num2=0,0
    34     #lock=threading.Lock()#定义一个线程锁,如是线程锁,递归时会出错
    35     lock=threading.RLock()#定义一个递归锁
    36 
    37     for i in range(10):
    38         #t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程
    39         t1=threading.Thread(target=run3,args=(('第%s线程'%i),))#新建线程
    40         t1.start()#起动线程
    41 
    42     else:
    43         print('活跃线程数:',threading.active_count())#查看线程 活跃线程数
    44 
    45 
    46 while threading.active_count()!=1:#不只一个线程,就是说,判断是否是剩下主线程
    47     #print(threading.active_count())#查看线程 活跃线程数
    48     pass
    49 else:
    50     print('主线程:pid,活跃线程数'.center(60,''),threading.current_thread(),threading.active_count())#
    51     den_time=time.time()-star_time#总共时间
    52     print(den_time)
    53     print(num1,num2)
    View Code

    信号量  相当与 多个线程锁 

     1 #!usr/bin/env python
     2 #-*-coding:utf-8-*-
     3 # Author calmyan
     4 
     5 #!usr/bin/env python
     6 #-*-coding:utf-8-*-
     7 # Author calmyan
     8 import time ,threading
     9 
    10 def run(attr):
    11     semaphore.acquire()#申请信号量线程锁
    12     global num
    13     print('输出:',attr)
    14     time.sleep(1)
    15     semaphore.release()#释放信号量线程锁
    16 
    17 star_time=time.time()#开始时间
    18 if __name__ == '__main__':
    19 
    20     semaphore=threading.BoundedSemaphore(4)#信号量 最多允许几个线程同时运行(多把锁)
    21     for i in range(50):
    22         t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程
    23         t1.start()#起动线程
    24 
    25 while threading.active_count()!=1:#不只一个线程,就是说,判断是否是剩下主线程
    26     pass
    27 else:
    28     print('主线程'.center(60,''),threading.current_thread(),threading.active_count())
    29     den_time=time.time()-star_time#总共时间
    30     print(den_time)
    View Code

    Event 线程标志

    红绿灯示例

     1 #!usr/bin/env python
     2 #-*-coding:utf-8-*-
     3 # Author calmyan
     4 
     5 import threading,time
     6 
     7 event=threading.Event()#生成一个标示位对象
     8 def lighter():#
     9     count=0 #定义时间秒数
    10     event.set()#设置标志位
    11     while True:
    12         if count>9 and count<15:#设定为红灯
    13             event.clear()#清除标志位,
    14             print('33[41;1m变为红灯!33[0m')
    15         elif count>=15 and count<18 :#为黄灯
    16 
    17             print('33[43;1m变为黄灯!33[0m')
    18         elif count>=18:
    19             event.set()#设置标志位
    20             print('33[42;1m变为绿灯!33[0m')
    21             count=0#重新计时
    22         else:
    23             print('33[42;1m绿灯中.....!33[0m')
    24         time.sleep(1)
    25         count+=1#每一秒钟加一次
    26 
    27 
    28 def car(name):
    29     while True:
    30         if event.is_set():#如果有标志 说明为绿灯
    31             print('[%s]在行驶中....'%name)
    32             time.sleep(1)
    33         else:
    34             print('[%s]在等待中.....'%name)
    35             event.wait()#等待获取标志
    36             print('绿灯亮了,[%s]继续行驶...'%name)
    37             time.sleep(1)
    38 
    39 
    40 light=threading.Thread(target=lighter,)#定义一个线程
    41 light.start()#启动线程
    42 
    43 car1=threading.Thread(target=car,args=('红旗轿车',))#生成一个汽车线程
    44 car1.start()
    View Code

    队列  生产者消费者模型

     1 #!usr/bin/env python
     2 #-*-coding:utf-8-*-
     3 # Author calmyan
     4 
     5 #队列 生产者消费者模型
     6 
     7 import threading,time,queue
     8 
     9 q=queue.Queue()#创建一个队列
    10 
    11 def produ(name):#生产函数
    12     count=0
    13     while True:
    14         bz=name+str(count)
    15         q.put(bz)
    16         print('[%s]生产了,第[%s]个[%s]g 包子'%(name,count,bz))
    17         count+=1
    18         time.sleep(1.5)
    19 
    20 def consump(name):#消费者
    21     while True:
    22         i=q.get()#
    23         print('[%s]拿到包子[%s],并吃了'%(name,i))
    24         time.sleep(0.5)
    25 
    26 
    27 p1=threading.Thread(target=produ,args=('王五包子铺',))#创建一个新线程 生产者
    28 p2=threading.Thread(target=produ,args=('麻子六包子铺',))#创建一个新线程 生产者
    29 r1=threading.Thread(target=consump,args=('张三',))#创建一个新线程 消费者
    30 r2=threading.Thread(target=consump,args=('李四',))#创建一个新线程 消费者
    31 p1.start()
    32 p2.start()
    33 r1.start()
    34 r2.start()
    View Code
  • 相关阅读:
    wtforms 钩子函数
    sqlalchemy 单表增删改查
    sqlalchemy 数据库操作
    flask wtforms组件
    python----------文件操作
    编码 编码的转化
    集合、深浅copy
    字典
    sort 、sorted、range、join方法 数字的正序、倒叙、翻转
    for循环
  • 原文地址:https://www.cnblogs.com/uge3/p/7067335.html
Copyright © 2020-2023  润新知