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