Python的线程之线程同步
目录
- 线程同步
- threading.Lock获取同步锁
- 总结
如下图,明明t-0 > t-1 > t-2 (按照线程创建时间早晚排列)。最后输出居然是t-1最落后。
文章图片
我们怎么样做避免错乱呢, 下面看看。
线程同步 多线程,就是多个独立的运行单位,同时执行同样的事情。
多线程不是已经做到同时执行了吗?还需要同步干嘛?
是的,线程是同时被调用执行了,但是每个线程之间互相独立,也互相竞争了。
这就跟跑道上有3个运动员,枪响之后同时开跑,但是他们通常却不是同时到达终点。
同步是什么意思?
同步就是原本这条跑道跑三个人的加上同步之后,在任意时间上,只有一个人在跑道。
听起来是不是匪夷所思,怎么多线程不是为多个任务提高效率吗?加个同步不就一个时间只有一个任务执行了,这还扯啥多线程。
很遗憾,同步就是这个意思,我们有时会说完整一点,同步互斥!总结来说就是:同步是一种机制,它保证跑道上面任何时候只有一个运动员。技术上来说就是,同步保证 程序数据 任何时候只被一个线程操作。
我们使用同步机制的时候,也是在找那些应该被限制的'跑道‘,利用同步机制保证在那个跑道上任意时刻只有一个‘运动员'在上面跑步。
(解释的很清楚了,看不懂的可以找同学讨论上面的这几句)
我们了解了同步机制,下面看看锁。
threading.Lock获取同步锁
threading.Lock
是一个类,我们能用它创建一个锁对象。什么是锁?锁要是坏了,后果可以自己想象(后面文章会说)。
维持同步互斥机制的媒介
相当于跑道有个大门,每次只开门让一个程序员进去跑
说错了,运动员(程序员还是需要多锻炼啊)。
我们下面代码会用到Lock的两个函数:
acquire函数:获取锁
release函数:释放锁
前文说过了,加上主线程,一共是4个线程。
运行下面代码看看:
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2021/11/21 12:02 上午# @Author : LeiXueWei# @CSDN/Juejin/Wechat: 雷学委# @XueWeiTag: CodingDemo# @File : __init__.py.py# @Project : helloimport threadingimport datetimeimport timedef dianzan_guanzhu(lock: threading.Lock):thread_name = threading.current_thread().getName()print("线程启动了:", thread_name)now = datetime.datetime.now()name = "python萌新" + thread_namelock.acquire()print("%s - %s name:%s" % (thread_name, now, name))time.sleep(1)result = "好棒!" + name + " 关注雷学委,学会了开发知识!"print("%s - %s result:%s" % (thread_name, now, result))lock.release()return resultmy_lock = threading.Lock()for i in range(3):mythread = threading.Thread(name="t-" + str(i), target=lambda: dianzan_guanzhu(my_lock))print("mythread:", mythread)print("is_alive:", mythread.is_alive())mythread.start()ac = threading.active_count()print("active_count:", ac)
下面是运行结果:
文章图片
我们看到每个线程都完整完成了任务,不会出现三个线程互相穿插错乱的输出。
这里初学者可以感受一下同步的作用,效果。
总结 以上就是一种线程协调方案。
线程同步,也并非同一步调,而是同步互斥!
【Python的线程之线程同步】本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量