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 --------------------- 使用信号量控制线程 --------------------------------

 

posted @ 2018-07-02 15:58  虫儿要吃草  阅读(566)  评论(0编辑  收藏  举报