zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    hdu 5446 Unknown Treasure lucas和CRT
    Hdu 5444 Elven Postman dfs
    hdu 5443 The Water Problem 线段树
    hdu 5442 Favorite Donut 后缀数组
    hdu 5441 Travel 离线带权并查集
    hdu 5438 Ponds 拓扑排序
    hdu 5437 Alisha’s Party 优先队列
    HDU 5433 Xiao Ming climbing dp
    hdu 5432 Pyramid Split 二分
    Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造
  • 原文地址:https://www.cnblogs.com/uge3/p/7067335.html
Copyright © 2011-2022 走看看