Pthon - 线程管理

  1 # 同一时间内执行多个任务
  2 # 多任务执行的方式
  3 # 并发:在一段时间内交替去执行任务
  4 # 并行:指的是任务数小于等于cpu核数时,任务真的是一起执行的。
  5 
  6 # 线程 cpu调试的基本单位 ,是程序执行的最小单位
  7 # 每个进程至少都有一个线程(这个线程就是主线程)。
  8 # 程序启动默认会有一个主线程
  9 
 10 # 程序员自己创建的线程称为子线程,多线程可以完成多任务。
 11 
 12 # 单线程
 13 # import time
 14 # def speak():
 15 #     print('老师上周没来讲课')
 16 #     time.sleep(2)
 17 #     print('结果同学们都玩去了')
 18 #
 19 # def dance():
 20 #     print('老师很伤心')
 21 #     time.sleep(2)
 22 #     print('跳个舞来挽救')
 23 #
 24 # if __name__ == '__main__':   #  条件满足时,程序直接运行
 25 #     speak()
 26 #     dance()
 27 
 28 # 多线程
 29 # 导入模块 import threading    Thread类----线程类
 30 # Thread类参数:
 31 # group:线程组
 32 # target:执行的目标任务名
 33 # args:以元组方式给执行任务来传参
 34 # kwargs :以字典给执行任务传参  key = value
 35 # name:线程名
 36 
 37 # 步骤 :
 38 # 1.导入模块
 39 # 2.创建子线程 Thread(target=func,args=(,),……)
 40 # 3.设置守护线程 setDaemon  # 主线程执行完了,子线程也会跟着结束
 41 # 4.启动子线程 start()
 42 # 5.阻塞主线程join()  t1.join()
 43 
 44 import time
 45 import threading
 46 
 47 t1 = time.time()  # 时间戳
 48 def dance(name):
 49     print('%s在跳鬼步舞'% name)
 50     time.sleep(1)
 51 
 52 if __name__ == '__main__':
 53     for i in range(4):
 54         # 创建子线程
 55         t = threading.Thread(target=dance,args=('欧阳同学',))  #逗号不能省略,是元组形式
 56         # 启动线程
 57         t.start()
 58 t2 = time.time()
 59 print('执行时间是:',t2-t1)
 60 
 61 # 多线程并发的操作
 62 # 从上例可知,并发的优势,在有等待的任务执行时,能够切换到其他线程执行,提高执行效率
 63 
 64 
 65 import time
 66 from threading import Thread
 67 
 68 def funa():
 69     print('学习')
 70     time.sleep(2)
 71     print('是黎明前的黑暗')
 72 
 73 def funb():
 74     print('来这里')
 75     time.sleep(2)
 76     print('面包票子朋友都会有的')
 77 
 78 if __name__ == '__main__':
 79     # 创建线程
 80     f1 = Thread(target=funa)
 81     f2 = Thread(target=funb)
 82 
 83     # 设置守护线程————主线程执行完了,子线程也会跟着结束
 84     f1.setDaemon(True)
 85     f2.setDaemon(True)
 86 
 87     # 启动线程
 88     f1.start()
 89     f1.join()   # f1执行完再执行主线程下面的代码(等待f1执行完再执行下面的) 我等你
 90     f2.start()
 91     f2.join()
 92 
 93     # 修改名字
 94     f1.setName('线程1')
 95     f2.setName('线程2')
 96 
 97     #获取名字
 98     print(f1.getName())
 99     print(f2.getName())
100 
101     print('这是主线程,哈哈')
102 
103 # 应用场景:IO密集型   多线程并发
104 # 定义一个线程类
105 # 1)继承Thread
106 # 2) 重构run方法(名称必须是run)
107 # 3)启动线程start   默认会调用 run方法
108 
109 from threading import Thread
110 import time
111 
112 class Ourthread(Thread): # 继承Thread类
113     # 重构run方法,规定就是用run这个名字,表示线程活动的方法
114     def run(self):
115         print('重温对象')
116         time.sleep(2)
117         print('你们还找得着北吗')
118 
119 if __name__ == '__main__':
120     # 创建一个线程实例
121     t1 = Ourthread()
122     # 启动线程    start 会默认去调用run方法
123     t1.start()
124 
125 # 线程之间执行是无序的,它是由cpu调试来决定的。cpu调试哪个线程,哪个线程就先执行,没有调试的线程就不能够执行。
126 import threading
127 import time
128 def task():
129     time.sleep(1)
130     print(f'当前线程:{threading.current_thread().name}\n',end='')  # 获取当前线程名
131 
132 if __name__ == '__main__':
133     for i in range(5):
134         t = threading.Thread(target=task)
135         t.start()
136 
137 from  threading import Thread
138 import time
139 list1 = []   #  全局变量
140 
141 # 写数据
142 def writedata():
143     for i in range(5):
144         list1.append(i)
145         time.sleep(0.2)
146     print(f'写入的数据:{list1}\n',end='')
147 
148 # 读数据
149 def readdata():
150     print(f'读取的数据:{list1}\n',end='')
151 
152 if __name__ == '__main__':
153     # 创建写入数据的线程
154     wd = Thread(target=writedata)
155     # 创建读取数据的线程
156     rd = Thread(target=readdata)
157 
158     # 启动线程
159     wd.start()
160     wd.join()
161     rd.start()
162     print('哈哈哈哈……')
163 
164 from threading import Thread
165 a = 0
166 b = 1000000
167 
168 def sum1():
169     for i in range(b):
170         global a
171         a += 1
172     print(f'第一次:{a}\n',end='')
173 # sum1()
174 
175 def sum2():
176     for i in range(b):
177         global a
178         a += 1
179     print(f'第二次:{a}\n', end='')
180 # sum2()
181 
182 if  __name__ == '__main__':
183     # 创建线程
184     t1 = Thread(target=sum1)
185     t2 = Thread(target=sum2)
186 
187     # 启动线程
188     t1.start()
189     # t1.join()
190     t2.start()
191 
192 # 效果:按顺序执行    我等你执行完我(主线程)再执行
193 
194 # 解决资源竞争的两种方法:1.线程同步join  2.互斥锁
195 # 互斥锁:成对出现的
196 # Lock 函数
197 # 加锁 acquire  # 释放锁release
198 from threading import Thread,Lock
199 a = 0
200 b = 1000000
201 # 创建锁
202 lock = Lock()
203 def sum1():
204     lock.acquire()  # 加锁
205     for i in range(b):
206         global a
207         a += 1
208     print(f'第一次:{a}\n',end='')
209     lock.release()    # 解锁
210 
211 def sum2():
212     lock.acquire()
213     for i in range(b):
214         global a
215         a += 1
216     print(f'第二次:{a}\n', end='')
217     lock.release()
218 
219 if  __name__ == '__main__':
220     # 创建线程
221     t1 = Thread(target=sum1)
222     t2 = Thread(target=sum2)
223 
224     # 启动线程
225     t1.start()
226     t2.start()

 

posted @ 2021-04-18 21:50  每天都在学习的自己  阅读(67)  评论(0)    收藏  举报