主线程创建子线程,子线程不执行完毕的话主线程不会销毁。主线程是给子线程收尸的。
python使用threading模块创建多线程
1. 没有多任务的程序
import time def sing(): """唱歌 5秒钟""" for i in range(5): print("----正在唱:菊花茶----") time.sleep(1) def dance(): """跳舞 5秒钟""" for i in range(5): print("----正在跳舞----") time.sleep(1) def main(): sing() dance() if __name__ == "__main__": main()
2. 多任务 线程
import time import threading def sing(): """唱歌 5秒钟""" for i in range(5): print("----正在唱:菊花茶----") time.sleep(1) def dance(): """跳舞 5秒钟""" for i in range(5): print("----正在跳舞----") time.sleep(1) def main(): t1 = threading.Thread(target=sing) t2 = threading.Thread(target=dance) t1.start() t2.start() if __name__ == "__main__": main()
3.让某些线程先执行
import threading import time def test1(): for i in range(5): print("-----test1---%d---" % i) def test2(): for i in range(5): print("-----test2---%d---" % i) def main(): t1 = threading.Thread(target=test1) t2 = threading.Thread(target=test2) t1.start() time.sleep(1) print("---1---") t2.start() time.sleep(1) print("---2---") print(threading.enumerate()) if __name__ == "__main__": main()
4. 循环查看当前运行的线程
import threading import time def test1(): for i in range(5): print("-----test1---%d---" % i) time.sleep(1) # 如果创建Thread时执行的函数,运行结束那么意味着 这个子线程结束了.... def test2(): for i in range(10): print("-----test2---%d---" % i) time.sleep(1) def main(): t1 = threading.Thread(target=test1) t2 = threading.Thread(target=test2) t1.start() t2.start() while True: print(threading.enumerate()) if len(threading.enumerate())<=1: break time.sleep(1) if __name__ == "__main__": main()
5. 验证创建线程以及运行时间
import threading import time def test1(): for i in range(5): print("-----test1---%d---" % i) time.sleep(1) def main(): # 在调用Thread之前先打印当前线程信息 print(threading.enumerate()) t1 = threading.Thread(target=test1) # 在调用Thread之后打印 print(threading.enumerate()) t1.start() # 在调用start之后打印 print(threading.enumerate()) if __name__ == "__main__": main()
6.线程共享全局变量
import threading import time # 定义一个全局变量 g_num = 100 def test1(): global g_num g_num += 1 print("-----in test1 g_num=%d----" % g_num) def test2(): print("-----in test2 g_num=%d=----" % g_num) def main(): t1 = threading.Thread(target=test1) t2 = threading.Thread(target=test2) t1.start() time.sleep(1) t2.start() time.sleep(1) print("-----in main Thread g_num = %d---" % g_num) if __name__ == "__main__": main()
import threading import time def test1(temp): temp.append(33) print("-----in test1 temp=%s----" % str(temp)) def test2(temp): print("-----in test2 temp=%s----" % str(temp)) g_nums = [11, 22] def main(): # target指定将来 这个线程去哪个函数执行代码 # args指定将来调用 函数的时候 传递什么数据过去 t1 = threading.Thread(target=test1, args=(g_nums,)) t2 = threading.Thread(target=test2, args=(g_nums,)) t1.start() time.sleep(1) t2.start() time.sleep(1) print("-----in main Thread g_nums = %s---" % str(g_nums)) if __name__ == "__main__": main()
7.共享全局变量出现的问题 - 资源竞争
import threading import time # 定义一个全局变量 g_num = 0 def test1(num): global g_num for i in range(num): g_num += 1 print("-----in test1 g_num=%d----" % g_num) def test2(num): global g_num for i in range(num): g_num += 1 print("-----in test2 g_num=%d=----" % g_num) def main(): t1 = threading.Thread(target=test1, args=(1000000,)) t2 = threading.Thread(target=test2, args=(1000000,)) t1.start() t2.start() # 等待上面的2个线程执行完毕.... time.sleep(5) print("-----in main Thread g_num = %d---" % g_num) if __name__ == "__main__": main()
8. 使用互斥锁解决资源竞争的问题
import threading import time # 定义一个全局变量 g_num = 0 def test1(num): global g_num # 上锁,如果之前没有被上锁,那么此时 上锁成功 # 如果上锁之前 已经被上锁了,那么此时会堵塞在这里,直到 这个锁被解开位置 mutex.acquire() for i in range(num): g_num += 1 # 解锁 mutex.release() print("-----in test1 g_num=%d----" % g_num) def test2(num): global g_num mutex.acquire() for i in range(num): g_num += 1 mutex.release() print("-----in test2 g_num=%d=----" % g_num) # 创建一个互斥锁,默认是没有上锁的 mutex = threading.Lock() def main(): t1 = threading.Thread(target=test1, args=(1000000,)) t2 = threading.Thread(target=test2, args=(1000000,)) t1.start() t2.start() # 等待上面的2个线程执行完毕.... time.sleep(2) print("-----in main Thread g_num = %d---" % g_num) if __name__ == "__main__": main()
import threading import time # 定义一个全局变量 g_num = 0 def test1(num): global g_num for i in range(num): mutex.acquire() # 上锁 g_num += 1 mutex.release() # 解锁 print("-----in test1 g_num=%d----" % g_num) def test2(num): global g_num for i in range(num): mutex.acquire() # 上锁 g_num += 1 mutex.release() # 解锁 print("-----in test2 g_num=%d=----" % g_num) # 创建一个互斥锁,默认是没有上锁的 mutex = threading.Lock() def main(): t1 = threading.Thread(target=test1, args=(1000000,)) t2 = threading.Thread(target=test2, args=(1000000,)) t1.start() t2.start() # 等待上面的2个线程执行完毕.... time.sleep(2) print("-----in main Thread g_num = %d---" % g_num) if __name__ == "__main__": main()