python 多线程笔记(2)-- 锁

锁是什么?什么场合使用锁?

锁是一种机制,用于保护那些会引起冲突的资源。

比如上厕所,进去之后第一件事干嘛?把厕所门反锁!表示什么呢?表示这个厕所正在使用中!

至于在厕所里面干大事、干小事、还是打飞机,都可以!

完事之后干嘛?把厕所门打开!表示什么呢?那谁,你可以进来打飞机了。

一、全局锁、函数内部上锁/解锁、函数打包进线程

import threading
import time

def my_func(num):
    global counter, mutex
    # 获得线程名
    threadname = threading.currentThread().getName()

    for i in range(num):
        mutex.acquire()         # 锁住①
        counter = counter + 1   # 保护②  如同厕所坑位是抢占性资源,同一时间只能一个人去蹲
        mutex.release()         # 解锁③

        print(threadname, i, counter)  # 再回去,坑位counter可能已被其它人蹲过
        time.sleep(1)

if __name__ == ‘__main__‘:

    counter = 0 # 计数器

    mutex = threading.Lock() # 创建锁

    threads = []
    for i in range(4):
        threads.append(threading.Thread(target=my_func, args=(10,))) # 创建线程

    for t in threads:
        t.setDaemon(True)       # 守护
        t.start()               # 启动线程

    for t in threads:
        t.join()                # 阻塞主程,直到线程退出

运行效果图:

可以发现到 counter 并不是顺序显示的,看官可以思考其原因。

二、全局锁、线程类、线程类run方法中上锁/解锁

import threading
import time

class Worker(threading.Thread):
    ‘‘‘线程类‘‘‘
    def __init__(self, num=5):
        super().__init__()
        self.num = num

    def run(self):
        global counter, mutex
        threadname = threading.currentThread().getName()

        for i in range(self.num):
            mutex.acquire()         # 锁住①
            counter = counter + 1   # 保护② 如同厕所坑位是抢占性资源,同一时间只能一个人去蹲
            mutex.release()         # 解锁③

            print(threadname, i, counter)  # 此时,counter可能又已被其它线程改变
            time.sleep(1)

if __name__ == ‘__main__‘:
    # 全局计数器
    counter = 1

    # 创建锁
    mutex = threading.Lock()

    # 创建线程对象
    threads = []
    for i in range(4):
        threads.append(Worker(10)) # 添加 4 个 Worker

    # 启动线程
    for t in threads:
        t.start()

    # 阻塞主程
    for t in threads:
        t.join()
时间: 2024-10-13 12:52:22

python 多线程笔记(2)-- 锁的相关文章

python 多线程笔记(5)-- 生产者/消费者模式

我们已经知道,对公共资源进行互斥访问,可以使用Lock上锁,或者使用RLock去重入锁. 但是这些都只是方便于处理简单的同步现象,我们甚至还不能很合理的去解决使用Lock锁带来的死锁问题. 要解决更复杂的同步问题,就必须考虑别的办法了. threading提供的Condition对象提供了对复杂线程同步问题的支持. Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法. 使用Condition的主要方式为: 线程首先a

python多线程之线程锁二(同一时间一个线程获得2把线程锁)

#coding:utf-8 '''线程锁''' import threading import time num = 0 #全局变量 num2 = 0 def runs():     time.sleep(1)     global num #在函数内部要对全局变量进行更改,需要进行声明     global num2     lock.acquire() #在操作时锁住,防止其他线程在同一时间对num变量进行加1,从而确保数据在同一时间确保只有一个线程对它进行更改,不然造成数据不正确     

python多线程之线程锁三(同一时间允许多个线程)

#coding:utf-8 import threading import time num = 0 #全局变量 def runs():     time.sleep(1)     global num #在函数内部要对全局变量进行更改,需要进行声明     samp.acquire() #在操作时,获得锁,4个线程都在里边被锁住     time.sleep(0.001)     num += 1    #虽然4个线程同时对num进行加1,但在相加的时候,CPU还是一个一个的加     pri

python 多线程笔记(6)-- 生产者/消费者模式(续)

用 threading.Event() 也可以实现生产者/消费者模式 (自己拍脑袋想出来的,无法知道其正确性,请大神告知为谢!) import threading import time import random products = 20 class Producer(threading.Thread): '''生产者''' ix = [0] # 生产者实例个数 # 闭包,必须是数组,不能直接 ix = 0 def __init__(self): super().__init__() sel

《python源码剖析》笔记 python多线程机制

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.GIL与线程调度 Python中的线程是操作系统的原生线程,Python虚拟机使用一个全局解释器锁(Global Interpreter Lock)来互斥线程对Python虚拟机的使用 为了支持多线程机制,一个基本的要求就是需要实现不同线程对共享资源访问的互斥,所以引入了GIL. GIL:在一个线程拥有了解释器的访问权之后,其他的所有线程都必须等待它释放解释器的访问权,即使这些线程的下

Python多线程锁

[Python之旅]第六篇(四):Python多线程锁 python lock 多线程 多线程使用方法 多线程锁 摘要:   在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来说一说. 1.给线程加锁的原因     我们知道,不同进程之间的内存空间数据是不能够共享的,试想一下,如果可以随意共享,谈何安全?但是一个进程中的多个线程是可以共享这个进程的内存空间中的数据的,比如多个线程可以同时调用某一... 在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来说一

【Python之旅】第六篇(四):Python多线程锁

    在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来说一说. 1.给线程加锁的原因 我们知道,不同进程之间的内存空间数据是不能够共享的,试想一下,如果可以随意共享,谈何安全?但是一个进程中的多个线程是可以共享这个进程的内存空间中的数据的,比如多个线程可以同时调用某一内存空间中的某些数据(只是调用,没有做修改). 试想一下,在某一进程中,内存空间中存有一个变量对象的值为num=8,假如某一时刻有多个线程需要同时使用这个对象,出于这些线程要实现不同功能的需要,线程A需要将n

python学习笔记-(十三)线程、进程、多线程&多进程

为了方便大家理解下面的知识,可以先看一篇文章:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 线程 1.什么是线程? 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 2.python GIL全局解释器锁(仅需了解) 无论你启多少个线程,你有多少个cpu, Python在执行的时

python 多线程锁机制

GIL(全局解释器锁) GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念,是为了实现不同线程对共享资源访问的互斥,才引入了GIL 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势 python对于计算密集型的任务开多线程的效率甚至不如串行(没有大量切换),但是,对于IO密集型的任务效率还是有显著提升的. GIL原理图 计算密集型:结果肯定是100,因为每一次start结果就已经出来了,所以第二个线程肯