zoukankan      html  css  js  c++  java
  • 23 python多线程threading及线程同步

      1 ################   多线程应用举例  写法1:  ####################################################
      2 import threading
      3 from time import ctime,sleep
      4 
      5 def func1():
      6     for i in range(5):
      7         print "i={}".format(i)
      8         sleep(1)
      9 
     10 def func2():
     11     for j in range(5):
     12         print "j={}".format(j)
     13         sleep(1)
     14 
     15 def main():
     16     print("start:",ctime())
     17     t1=threading.Thread(target=func1)
     18     t2=threading.Thread(target=func2)
     19 
     20     t1.start()
     21     t2.start()
     22 
     23     t1.join()
     24     t2.join()   ## 这里最好是加join函数,因为如果不加,则不等前面执行完,则pint这个后面语句则会被执行(不会等待)
     25     print '11111'  ## 即如果不加,则主线程不会等待子线程是否执行完
     26 
     27 if __name__ == '__main__':
     28     main()
     29 
     30 
     31 
     32 
     33 ################   多线程应用举例  写法2:  ####################################################
     34 
     35 
     36 import threading
     37 from time import ctime,sleep
     38 
     39 def func1():
     40     for i in range(5):
     41         print "i={}".format(i)
     42         sleep(1)
     43 
     44 def func2():
     45     for j in range(5):
     46         print "j={}".format(j)
     47         sleep(1)
     48 
     49 
     50 class mythread(threading.Thread)   ##继承threading类,
     51     def __init__(self,func):
     52         threading.Thread.__init__(self)
     53         self.func=func
     54 
     55     def run(self):
     56         self.func()
     57 
     58 def main():
     59     print("start:",ctime())
     60     t1=mythread(func1)
     61     t2=mythread(func2)
     62 
     63     t1.start()
     64     t2.start()
     65 
     66     t1.join()
     67     t2.join()   ## 这里最好是加join函数,因为如果不加,则不等前面执行完,则pint这个后面语句则会被执行(不会等待)
     68     print '11111'  ## 即如果不加,则主线程不会等待子线程是否执行完
     69 
     70 if __name__ == '__main__':
     71     main()
     72 
     73 
     74 ########################## 线程同步  ################################################################
     75 说明:
     76     多个进程同时操作一个资源,需要有线程同步,防止同时修改或访问,这样会造成数据错误。
     77     如果不涉及操作同一个资源,(则也没有必要线程同步,只用多线程即可)
     78 
     79 
     80 ## 线程的同步
     81 import threading
     82 from time import sleep
     83 
     84 tickets=100
     85 
     86 class Window(threading.Thread):
     87     """docstring for Window."""
     88     def __init__(self, n,lock):
     89         self.lock=lock
     90         threading.Thread.__init__(self,name=n) ## 调用父类的构造方法
     91     def take(self):
     92         global tickets
     93         while tickets>=1:
     94             self.lock.acquire()  ##加锁
     95 
     96             print ("%s:%d" %(threading.currentThread().name,tickets))
     97             tickets=tickets-1
     98 
     99             self.lock.release() ##释放锁
    100             sleep(1)
    101 
    102     def run(self):   ## 复写你类的RUN函数,即覆盖了父类的run函数
    103         self.take()
    104 
    105 
    106 def main():
    107     lock=threading.Lock()
    108     for i in range(1,5):  ## 有4个窗口同时卖票
    109         name='w'+str(i)   ## 定义窗口名字
    110         w=Window(name,lock)  ##此窗口开始卖票(参数为窗口名,和锁对象),因为实例化的线程类,所以有5个线程
    111         w.start()  ## 调用父类的start方法
    112 
    113 if __name__ == '__main__':
    114     main()
    115 
    116 ------------------- 使用上下文管理器 with 进行同步---------------------
    117 
    118 说明:
    119     还可以使用with时lock的作用载,上面的代码lock.acquire() 和 lock.release()之间的代码 ,使用with包含即可。
    120 
    121 ## 线程的同步
    122 import threading
    123 from time import sleep
    124 
    125 tickets=100
    126 
    127 class Window(threading.Thread):
    128     """docstring for Window."""
    129     def __init__(self, n,lock):
    130         self.lock=lock
    131         threading.Thread.__init__(self,name=n) ## 调用父类的构造方法
    132     def take(self):
    133         global tickets
    134         while tickets>=1:
    135             # self.lock.acquire()  ##加锁
    136             with self.lock:      ## 使用with上下文管理器
    137                 print ("%s:%d" %(threading.currentThread().name,tickets))
    138                 tickets=tickets-1
    139 
    140             # self.lock.release()  ##释放锁
    141             sleep(1)
    142 
    143     def run(self):   ## 复写你类的RUN函数,即覆盖了父类的run函数
    144         self.take()
    145 
    146 
    147 def main():
    148     lock=threading.Lock()
    149     for i in range(1,5):  ## 有5个窗口同时卖票
    150         name='w'+str(i)   ## 定义窗口名字
    151         w=Window(name,lock)  ##此窗口开始卖票(参数为窗口名,和锁对象),因为实例化的线程类,所以有5个线程
    152         w.start()  ## 调用父类的start方法
    153 
    154 if __name__ == '__main__':
    155     main()
    156 
    157 --------------------- 使用信号量控制线程 --------------------------------
  • 相关阅读:
    Solaris安装pkg
    JSP路径出现问题
    错误卸载软件导致Windows7系统中的软件无法播放视频
    蛋疼的Solaris设置
    SQL运行突然SESSION中断错误
    JAVA利用Zip4j解压缩
    java解压缩/压缩/加密压缩/加密解压缩 ZIP4J---ZIP文件压缩与解压缩学习
    未得冠军的运动员也有教练——Leo鉴书71
    VS2008 编译SQLite 3.8.4.3 + sqlcipher-3.1.0 + openssl-1.0.1g
    Android数据库安全解决方案,使用SQLCipher进行加解密
  • 原文地址:https://www.cnblogs.com/2mei/p/9254258.html
Copyright © 2011-2022 走看看