Python的线程之线程同步
作者:雷学委 发布时间:2021-02-05 23:23:32
在多线程程序中,它们互相独立打印的时间却是错乱的!
如下图,明明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 : hello
import threading
import datetime
import time
def dianzan_guanzhu(lock: threading.Lock):
thread_name = threading.current_thread().getName()
print("线程启动了:", thread_name)
now = datetime.datetime.now()
name = "python萌新" + thread_name
lock.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 result
my_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)
下面是运行结果:
我们看到每个线程都完整完成了任务,不会出现三个线程互相穿插错乱的输出。
这里初学者可以感受一下同步的作用,效果。
线程同步,也并非同一步调,而是同步互斥!
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
来源:https://blog.csdn.net/geeklevin/article/details/121917545
猜你喜欢
- 虽然小型web应用程序用单个脚本可以很方便,但这种方法却不能很好地扩展。随着应用变得复杂,在单个大的源文件中处理会变得问题重重。与大多数其他
- 在Pytorch中,torch.utils.data中的Dataset与DataLoader是处理数据集的两个函数,用来处理加载数据集。通常
- 一个图形化的交互式运行环境,对于编程语言的学习和开发,特别是可视化方面,提供了极大的便利。比如在window上使用R语言进行绘图,在R语言自
- 一、什么是线程?线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程。车间负责把资源整合到一起,
- 1.引入库需要用到3个类,ElementTree,Element以及建立子类的包装类SubElementfrom xml.etree.Ele
- 如下所示:def test1(): import os return1=os.system('ping 8.8.8.8')
- max_redis.php<?phpset_time_limit (0);for($i=1;$i<=1050;$i++){exe
- 1. 简介NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数
- 使用django启动命令行和脚本,可以方便的使用django框架做开发,例如,数据库的操作等。下面分别介绍使用方法。django shell
- 本文转自微信公众号:"算法与编程之美",一、问题描述在collections模块中的defauldict使用时与dict
- 目的现有两幅栅格图像,一个是某地区道路栅格图,一个是某地区土地利用类型图,需要将道路叠加到土地利用类型图中,即叠加后,重合的像元值以道路图为
- 注:答案一般在网上都能够找到。1.对if __name__ == 'main'的理解陈述2.python是如何进行内存管理的
- 前言我们百度搜索一些东西得时候,经常找到文档里面然后就会发现需要充值才能复制!怎么可以不花钱也保存呢?今天就分享给大家一个python获取文
- 上一篇自动在Windows中运行Python脚本并定时触发功能实现传送门链接运行Python脚本:.bat文件在Windows中,.bat文
- 前言因为一些懂得都懂的原因,我的父母对于我电脑上的文件内容特别感兴趣。为了防止信息泄露,我连夜用Python做了一个文件加密器,防止我的重要
- 2.彻底弄懂CSS盒子模式二(导航栏实例) 3.彻底弄懂CSS盒子模式三(浮动的表演和清除的自述) 4.彻底弄懂CSS盒子模式四(绝对定位和
- 概述pydicom是一个常用python DICOM parser。但是,没有提供解析多帧图的示例。本文结合相关函数和DICOM知识做一个简
- 今天同学向我提了一个问题,我觉得蛮有意思,现记录下来大家探讨下。问题是:在一个表里面,有一个允许为空的字段,空是可以重复的,但是不为空的值需
- 这回我们看看如何实现判断两个对像的内容是否相等。这里有一个克隆结果原则是针对Java语言的,当然JavaScript也可以胜任。克隆满足的条
- 本文实例讲述了python爬虫学习笔记之Beautifulsoup模块用法。分享给大家供大家参考,具体如下:相关内容:什么是beautifu