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()

 

目录
相关文章
|
12天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
22天前
|
算法 数据处理 Python
Python并发编程:解密异步IO与多线程
本文将深入探讨Python中的并发编程技术,重点介绍异步IO和多线程两种常见的并发模型。通过对比它们的特点、适用场景和实现方式,帮助读者更好地理解并发编程的核心概念,并掌握在不同场景下选择合适的并发模型的方法。
|
1月前
|
安全 Java 关系型数据库
深入探究Python的多线程与异步编程:实战与最佳实践
【2月更文挑战第1天】 深入探究Python的多线程与异步编程:实战与最佳实践
128 0
|
1月前
|
缓存 负载均衡 安全
在Python中,如何使用多线程或多进程来提高程序的性能?
【2月更文挑战第17天】【2月更文挑战第50篇】在Python中,如何使用多线程或多进程来提高程序的性能?
|
30天前
|
安全 Python
Python中的并发编程:多线程与多进程技术探究
本文将深入探讨Python中的并发编程技术,重点介绍多线程和多进程两种并发处理方式的原理、应用场景及优缺点,并结合实例分析如何在Python中实现并发编程,以提高程序的性能和效率。
|
1月前
|
数据采集 存储 Java
「多线程大杀器」Python并发编程利器:ThreadPoolExecutor,让你一次性轻松开启多个线程,秒杀大量任务!
「多线程大杀器」Python并发编程利器:ThreadPoolExecutor,让你一次性轻松开启多个线程,秒杀大量任务!
|
1月前
|
安全 调度 Python
Python中如何实现多线程?请举例说明。
Python中如何实现多线程?请举例说明。
14 0
|
1月前
|
Python
Python中的并发编程与多线程
在当今高并发的网络应用环境中,如何充分利用计算资源来提高程序的执行效率是一个关键问题。本文将探讨Python中的并发编程技术,重点介绍了多线程的使用方法和注意事项,帮助读者更好地理解并发编程在Python中的应用。
|
5天前
|
调度 Python
Python多线程、多进程与协程面试题解析
【4月更文挑战第14天】Python并发编程涉及多线程、多进程和协程。面试中,对这些概念的理解和应用是评估候选人的重要标准。本文介绍了它们的基础知识、常见问题和应对策略。多线程在同一进程中并发执行,多进程通过进程间通信实现并发,协程则使用`asyncio`进行轻量级线程控制。面试常遇到的问题包括并发并行混淆、GIL影响多线程性能、进程间通信不当和协程异步IO理解不清。要掌握并发模型,需明确其适用场景,理解GIL、进程间通信和协程调度机制。
22 0
|
29天前
|
并行计算 Python
Python中的并发编程:多线程与多进程的比较
在Python编程中,实现并发操作是提升程序性能的重要手段之一。本文将探讨Python中的多线程与多进程两种并发编程方式的优劣及适用场景,帮助读者更好地选择合适的方法来提高程序运行效率。