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