多线程
案例
说明:
- 唱歌方法
sing()
- 跳舞方法
dance()
- 启用两个线程调用
- 主线程结束
代码
# 导入线程模块 import threading import time def sing(name,age): time.sleep(2) print('唱歌者姓名:' + name + ',年龄:' + str(age)) print('正在唱歌...') def dance(name, age): time.sleep(2) print('跳舞者姓名:' + name + ',年龄:' + str(age)) print('正在跳舞...') if __name__ == '__main__': # args 元组传参 t1 = threading.thread(target=sing,args=('alice', 18)) # kwargs 对象传参 t2 = threading.thread(target=dance,kwargs={'name': 'bob', 'age': 18}) t1.start() t2.start() print("主线程结束")
- 运行
问题现象
- 输出的结果和代码的执行顺序不一致
- 最后的主线程输出竟然最先输出
- 线程的执行是异步的并非同步
- 那么如何让线程同步执行呢?请看下一章节 《解决办法》
解决办法
线程同步
- 线程等待
- 互斥锁
线程等待
调用线程的等待方法: join()
- 代码
# 导入线程模块 from threading import thread import time def sing(name,age): time.sleep(2) print('唱歌者姓名:' + name + ',年龄:' + str(age)) print('正在唱歌...') def dance(name, age): time.sleep(2) print('跳舞者姓名:' + name + ',年龄:' + str(age)) print('正在跳舞...') if __name__ == '__main__': # args 元组传参 t1 = thread(target=sing,args=('alice', 18)) # kwargs 对象传参 t2 = thread(target=dance,kwargs={'name': 'bob', 'age': 18}) t1.start() t1.join() t2.start() t2.join() print("主线程结束")
- 运行
互斥锁
步骤:
- 导入锁模块:
from threading import lock
- 实例化锁:
lock = lock()
- 获取锁:
lock.acquire()
- 释放锁:
lock.release()
代码
# 导入线程模块 from threading import thread, lock import time def sing(name, age): # 获取锁,用于线程同步 lock.acquire() time.sleep(2) print('唱歌者姓名:' + name + ',年龄:' + str(age)) print('正在唱歌...') # 释放锁,开启下一个线程 lock.release() def dance(name, age): # 获取锁,用于线程同步 lock.acquire() time.sleep(2) print('跳舞者姓名:' + name + ',年龄:' + str(age)) print('正在跳舞...') # 释放锁,开启下一个线程 lock.release() # 创建一个锁 lock = lock() if __name__ == '__main__': # args 元组传参 t1 = thread(target=sing, args=('alice', 18)) # kwargs 对象传参 t2 = thread(target=dance, kwargs={'name': 'bob', 'age': 18}) t1.start() # t1.join() t2.start() # t2.join() # print("主线程结束")
运行
到此这篇关于python中线程同步的实现的文章就介绍到这了,更多相关python 线程同步内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论