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 threading123 from time import sleep124 125 tickets=100126 127 class Window(threading.Thread):128 """docstring for Window."""129 def __init__(self, n,lock):130 self.lock=lock131 threading.Thread.__init__(self,name=n) ## 调用父类的构造方法132 def take(self):133 global tickets134 while tickets>=1:135 # self.lock.acquire() ##加锁136 with self.lock: ## 使用with上下文管理器137 print ("%s:%d" %(threading.currentThread().name,tickets))138 tickets=tickets-1139 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 --------------------- 使用信号量控制线程 --------------------------------