Python的线程之线程同步

作者:雷学委 时间:2021-02-05 23:23:32 

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

如下图,明明t-0 > t-1 > t-2 (按照线程创建时间早晚排列)。最后输出居然是t-1最落后。

Python的线程之线程同步

我们怎么样做避免错乱呢, 下面看看。

线程同步

多线程,就是多个独立的运行单位,同时执行同样的事情。

多线程不是已经做到同时执行了吗?还需要同步干嘛?

是的,线程是同时被调用执行了,但是每个线程之间互相独立,也互相竞争了。

这就跟跑道上有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)

下面是运行结果:

Python的线程之线程同步

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

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

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

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

来源:https://blog.csdn.net/geeklevin/article/details/121917545

标签:Python,线程,同步
0
投稿

猜你喜欢

  • Python学习笔记之列表推导式实例分析

    2021-04-30 15:00:38
  • Windows64x下VScode下载过程

    2021-03-08 20:10:47
  • Python语法垃圾回收机制原理解析

    2021-04-02 13:37:45
  • CentOS+Nginx+PHP+MySQL详细配置(图解)

    2023-11-24 03:04:13
  • web高性能开发系列随笔 BearRui(AK-47)版

    2023-04-10 10:58:22
  • Python3正则表达式之:(?(id/name)yes-pattern|no-pattern)条件性匹配

    2022-04-09 14:46:32
  • php实现网站留言板功能

    2023-11-23 21:06:36
  • python爬虫实战项目之爬取pixiv图片

    2021-04-17 00:01:29
  • MySQL大库搭建主从的一种思路分享

    2024-01-21 22:53:34
  • asp如何对多个条件进行判断?

    2009-11-20 18:28:00
  • pyMySQL SQL语句传参问题,单个参数或多个参数说明

    2024-01-18 13:21:33
  • 我要如何了解用户的需求

    2007-08-26 17:19:00
  • Python简繁体转换的简单实现步骤

    2023-10-03 05:02:20
  • vue动态设置页面title的方法实例

    2023-07-02 16:38:56
  • pandas 数据归一化以及行删除例程的方法

    2022-05-23 09:11:23
  • Win10环境python3.7安装dlib模块趟过的坑

    2021-03-25 14:09:25
  • Python中的赋值、浅拷贝、深拷贝介绍

    2023-09-29 06:01:54
  • python 地图经纬度转换、纠偏的实例代码

    2021-11-06 11:12:18
  • 利用Python进行数据可视化的实例代码

    2023-11-24 10:21:45
  • python引入requests报错could not be resolved解决方案

    2022-08-28 08:24:45
  • asp之家 网络编程 m.aspxhome.com