我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python的线程之线程同步

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python的线程之线程同步

在多线程程序中,它们互相独立打印的时间却是错乱的!

如下图,明明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)

下面是运行结果:

我们看到每个线程都完整完成了任务,不会出现三个线程互相穿插错乱的输出。

这里初学者可以感受一下同步的作用,效果。

总结

以上就是一种线程协调方案。

线程同步,也并非同一步调,而是同步互斥!

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python的线程之线程同步

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python多线程之间的同步(一)

引言:       线程之间经常需要协同工作,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直到该线程完成对数据的操作。这些技术包括临界区(Critical Section),互斥量(Mutex),信号量(Semapho
2023-01-31

Python线程同步

from random import randintimport threadingfrom time import ctime, sleepdata = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', '
2023-01-31

多线程之线程同步的方法(7种)

1. 锁机制:使用锁对象对需要同步的代码块进行加锁,确保同一时刻只有一个线程可以执行该代码块。2. 互斥量:使用互斥量(Mutex)来保证同一时刻只有一个线程可以访问共享资源。3. 信号量:使用信号量(Semaphore)来限制同时访问共享
2023-09-15

Java线程之线程同步synchronized和volatile详解

上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程共享的,一个线程改变了其成员变量num值
2023-05-30

Python 中的进程、线程、协程、同步

进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生?在刚刚结束的 PyCon2014 上海站,来自七牛云存储的 Python 高级工程师许智翔带来了关于 Python 的分享《Pyt
2023-01-31

java多线程之线程同步的方法有哪些

Java中线程同步的方法有以下几种:1. synchronized关键字:使用synchronized关键字可以实现对代码块、方法或对象的同步,确保同一时间只有一个线程可以访问被同步的代码块、方法或对象。2. ReentrantLock类:
2023-09-27

Python线程安全之三大同步原语

在多线程编码中,因为由上下文切换,所以某个代码块需要作为一个原子单元执行(即不可分割),就需要使用锁的机制来保护;同时在修改共享可变数据的时候,一定也要通过锁机制保护;另外使用的第三方库可能不是线程安全的;不确定线程安全性时使用互斥锁是一种

python同步原语--线程锁

多线程锁是python多种同步原语中的其中一种。首先解析一下什么是同步原语,python因为GIL(全局解析锁)的缘故,并没有真正的多线性。另外python的多线程存在一个问题,在多线程编程时,会出现线程同时调用共同的存储空间而导致错误的出
2023-01-30

Java学习之线程同步与线程间通信详解

这篇文章主要为大家详细介绍了线程同步和线程之间的通信的相关知识,文中的示例代码讲解详细,对我们学习Java有一定的帮助,感兴趣的可以了解一下
2022-12-27

Android jni 线程同步

文章目录概述问题示例c++层java层结果解决办法java层加锁c++层加锁java层和c++层共用一个锁 概述 android中可以通过jni调用native的方法,那么如果在java中存在多个线程调用native的方法,它的展现形式是如
2022-06-06

Java如何实现多线程、线程同步

这篇文章主要介绍了Java如何实现多线程、线程同步的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java如何实现多线程、线程同步文章都会有所收获,下面我们一起来看看吧。1 多线程1.1 进程进程:是正在运行的程
2023-06-30

Python中怎么实现线程同步

这篇文章主要介绍“Python中怎么实现线程同步”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中怎么实现线程同步”文章能帮助大家解决问题。使用 Thread 对象的 Lock 和 Rlo
2023-06-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录