python 多线程
2020-11-21 17:13 清风软件测试开发 阅读(145) 评论(0) 编辑 收藏 举报python 多线程
import threading from time import ctime,sleep def eat(sth): for i in range(2): print("I am eating %s. %s" %(sth,ctime())) sleep(1) def drink(sth): for i in range(2): print("I am drinking %s! %s" %(sth,ctime())) sleep(5) threads = [] t1 = threading.Thread(target=eat,args=('水果',)) threads.append(t1) t2 = threading.Thread(target=drink,args=('啤酒',)) threads.append(t2) # t1.start() # t2.start() # print("都结束了 %s" %ctime()) if __name__ == '__main__': for t in threads: t.start() print("聚餐全部结束了 %s" %ctime()) 输出结果: I am eating 水果. Sat Nov 21 16:43:46 2020 I am drinking 啤酒! Sat Nov 21 16:43:46 2020
聚餐全部结束了 Sat Nov 21 16:43:46 2020 I am eating 水果. Sat Nov 21 16:43:47 2020 I am drinking 啤酒! Sat Nov 21 16:43:51 2020 Process finished with exit code 0
用threading.Thread类来开启多线程
import threading import time class myThread(threading.Thread): # 继承父类threading.Thread def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数 def run(self): print("Starting " + self.name + ' at: ' + time.ctime(time.time())) print_time(self.name, self.counter, 5) print("Exiting " + self.name + ' at: ' + time.ctime(time.time())) def print_time(threadName, counter, delay): while counter: time.sleep(delay) print("%s process at: %s" % (threadName, time.ctime(time.time()))) counter -= 1 # 创建新线程 thread1 = myThread(1, "Thread-1", 10) thread2 = myThread(2, "Thread-2", 10) # 开启线程 thread1.start() thread2.start() # 等待线程结束 thread1.join() thread2.join() print("主线程和子线程全部结束。。。。。。。。") 输出结果: Starting Thread-1 at: Sat Nov 21 16:55:00 2020 Starting Thread-2 at: Sat Nov 21 16:55:00 2020 Thread-2 process at: Sat Nov 21 16:55:05 2020 Thread-1 process at: Sat Nov 21 16:55:05 2020 Thread-2 process at: Sat Nov 21 16:55:10 2020 Thread-1 process at: Sat Nov 21 16:55:10 2020 Thread-1 process at: Sat Nov 21 16:55:15 2020 Thread-2 process at: Sat Nov 21 16:55:15 2020 Thread-2 process at: Sat Nov 21 16:55:20 2020 Thread-1 process at: Sat Nov 21 16:55:20 2020 Thread-2 process at: Sat Nov 21 16:55:25 2020 Thread-1 process at: Sat Nov 21 16:55:25 2020 Thread-2 process at: Sat Nov 21 16:55:30 2020 Thread-1 process at: Sat Nov 21 16:55:30 2020 Thread-1 process at: Sat Nov 21 16:55:35 2020 Thread-2 process at: Sat Nov 21 16:55:35 2020 Thread-1 process at: Sat Nov 21 16:55:40 2020 Thread-2 process at: Sat Nov 21 16:55:40 2020 Thread-2 process at: Sat Nov 21 16:55:45 2020 Thread-1 process at: Sat Nov 21 16:55:45 2020 Thread-1 process at: Sat Nov 21 16:55:50 2020 Exiting Thread-1 at: Sat Nov 21 16:55:50 2020 Thread-2 process at: Sat Nov 21 16:55:50 2020 Exiting Thread-2 at: Sat Nov 21 16:55:50 2020 主线程和子线程全部结束。。。。。。。。 Process finished with exit code 0
不带锁的多线程共享资源
def work(): global n print('开始执行work方法') # lock.acquire() # print('已经获取线程的锁资源') temp=n # time.sleep(5) n=temp-1 print('n : ' + str(n)) # lock.release() print('work方法执行结束。。。。。。') if __name__ == '__main__': # lock=Lock() n=10 for i in range(10): p=Thread(target=work) p.start() 输出结果: #----------------下面的结果是瞬间输出的,基本上没有先后顺序--------------------- 开始执行work方法 n : 9 work方法执行结束。。。。。。 开始执行work方法 n : 8 work方法执行结束。。。。。。 开始执行work方法 n : 7 work方法执行结束。。。。。。 开始执行work方法 n : 6 work方法执行结束。。。。。。 开始执行work方法 n : 5 work方法执行结束。。。。。。 开始执行work方法 n : 4 work方法执行结束。。。。。。 开始执行work方法 n : 3 work方法执行结束。。。。。。 开始执行work方法 n : 2 work方法执行结束。。。。。。 开始执行work方法 n : 1 work方法执行结束。。。。。。 开始执行work方法 n : 0 work方法执行结束。。。。。。 Process finished with exit code 0
简单的锁机制
from threading import Thread,Lock import os,time def work(): global n print('开始执行work方法') lock.acquire() print('已经获取线程的锁资源') temp=n time.sleep(5) n=temp-1 print('n : ' + str(n)) lock.release() print('work方法执行结束,已经释放线程的锁') if __name__ == '__main__': lock=Lock() n=10 for i in range(10): p=Thread(target=work) p.start() 输出结果: 开始执行work方法 已经获取线程的锁资源 开始执行work方法 开始执行work方法 开始执行work方法 开始执行work方法 开始执行work方法 开始执行work方法 开始执行work方法 开始执行work方法 开始执行work方法 #--------------5秒之后开始输出下一行----------------- n : 9 work方法执行结束,已经释放线程的锁 已经获取线程的锁资源 #--------------5秒之后开始输出下一行----------------- n : 8 work方法执行结束,已经释放线程的锁 已经获取线程的锁资源 #--------------5秒之后开始输出下一行----------------- n : 7 work方法执行结束,已经释放线程的锁 已经获取线程的锁资源 #--------------5秒之后开始输出下一行----------------- n : 6 work方法执行结束,已经释放线程的锁 已经获取线程的锁资源 #--------------5秒之后开始输出下一行----------------- n : 5 work方法执行结束,已经释放线程的锁 已经获取线程的锁资源 #--------------5秒之后开始输出下一行----------------- n : 4 work方法执行结束,已经释放线程的锁 已经获取线程的锁资源 #--------------5秒之后开始输出下一行----------------- n : 3 work方法执行结束,已经释放线程的锁 已经获取线程的锁资源 #--------------5秒之后开始输出下一行----------------- n : 2 work方法执行结束,已经释放线程的锁 已经获取线程的锁资源 #--------------5秒之后开始输出下一行----------------- n : 1 work方法执行结束,已经释放线程的锁 已经获取线程的锁资源 #--------------5秒之后开始输出下一行----------------- n : 0 work方法执行结束,已经释放线程的锁 Process finished with exit code 0
def work(): global n print('开始执行work方法') # lock.acquire() # print('已经获取线程的锁资源') temp=n time.sleep(5) n=temp-1 print('n : ' + str(n)) # lock.release() print('work方法执行结束。。。。。。') if __name__ == '__main__': # lock=Lock() n=10 for i in range(10): p=Thread(target=work) p.start() 输出结果: 开始执行work方法 开始执行work方法 开始执行work方法 开始执行work方法 开始执行work方法 开始执行work方法 开始执行work方法 开始执行work方法 开始执行work方法 开始执行work方法 #---------------下面的结果是等5秒之后瞬间输出的,基本上没有先后顺序------------------ n : 9 work方法执行结束。。。。。。 n : 9 n : 9 work方法执行结束。。。。。。n : 9work方法执行结束。。。。。。 n : 9 work方法执行结束。。。。。。 work方法执行结束。。。。。。 n : 9 work方法执行结束。。。。。。 n : 9 work方法执行结束。。。。。。 n : 9n : 9 work方法执行结束。。。。。。 n : 9 work方法执行结束。。。。。。 work方法执行结束。。。。。。 Process finished with exit code 0