python实现多进程并发控制Semaphore与互斥锁LOCK

Python提供了多种在多进程中保证资源同步与控制的工具,其中Semaphore和互斥锁(读-写锁)是最常用的。

Semaphore 控制并发数

Semaphore(信号量)可以用来控制并发进程数,通过设置一个并发的数量(也就是信号量),后续的进程就会通过信号量来控制并发,避免进程数量过多导致系统资源不足。通过Semaphore控制同一时间只有一定数量的进程能够同时执行,这在一些场景下非常实用。

示例:

import time
import random
from multiprocessing import Semaphore, Process

s = Semaphore(3)  # 控制并发量为3个

def worker(s, num):
    s.acquire()  # 获取信号量
    print(f"线程{num}开始执行任务")
    time.sleep(random.random() * 5)  # 模拟任务执行
    print(f"线程{num}执行任务完成")
    s.release()  # 释放信号量

for i in range(10):
    p = Process(target=worker, args=(s, i))
    p.start()

以上的代码创建了10个进程,但是我们设置的并发量为3,因此只有前三个进程可以立即获得信号量并开始执行任务。

互斥锁LOCK控制资源访问

当多个进程访问同一份资源时,为了避免在同时写入时出现冲突,需要控制资源的访问,此时互斥锁(Lock)派上了用场。Lock能够通过设施锁和释放锁来保证同一时间只有一个进程操作该资源,避免冲突。

示例:

import time
from multiprocessing import Process, Lock

def worker(lock, num, table):
    with lock:
        print(f"线程{num}读取表格内容:", table)
        time.sleep(1)
        table[num] = num + 1
        print(f"线程{num}执行写入操作后表格内容:", table)

table = [0] * 5  # 表格
lock = Lock()  # 互斥锁

for i in range(5):
    p = Process(target=worker, args=(lock, i, table))
    p.start()

以上的代码创建了5个进程,通过互斥锁保证了同时只有一个进程在操作表格。这样就避免了在修改某个元素时,其他进程同时修改造成的错误。

参考资料:

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现多进程并发控制Semaphore与互斥锁LOCK - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Kotlin协程Job生命周期结构化并发详解

    下面是”Kotlin协程Job生命周期结构化并发详解”的完整攻略: Kotlin协程Job生命周期结构化并发详解 概述 Kotlin协程是一种非阻塞式的并发处理机制,它可以极大地简化并发编程。其中一个核心概念就是协程的Job,Job代表了协程的执行任务。在实际使用中,Job可以用来管理和控制协程的生命周期以及取消协程的执行。 本文将详细讲解Kotlin协程J…

    多线程 2023年5月17日
    00
  • Java中线程的基本方法使用技巧

    Java中线程的基本方法使用技巧 1. 线程的创建 Java语言支持线程的创建,常用的线程创建方式有两种:继承Thread类与实现Runnable接口。 1.1 继承Thread类 继承Thread类是一种比较直接的方式,只需要重写Thread类的run()方法即可实现线程的创建。 class MyThread extends Thread { public…

    多线程 2023年5月16日
    00
  • Python高并发和多线程有什么关系

    Python高并发和多线程是密不可分的概念,下面我将详细讲解它们的关系。 一、概念解释 高并发 高并发指在同一时间内有大量的请求需要处理,需要系统具备快速的响应速度和稳定的性能。在Python中,常用的高并发处理方式有异步编程和多线程处理。 多线程 多线程指在同一时间内有多个线程在执行不同的任务。多线程使得任务可以并发执行,提高了系统的处理能力。 二、多线程…

    多线程 2023年5月16日
    00
  • 【java 多线程】守护线程与非守护线程的详解

    Java多线程:守护线程与非守护线程的详解 什么是守护线程? 在Java多线程中,守护线程是一种在后台运行的线程,它不会阻止程序的结束,也不会执行任何没有被其他非守护线程阻止的操作。 换句话说,当程序中最后一个非守护线程结束时,JVM会强制退出来,即使守护线程还在运行。 如何创建守护线程? 可以通过Thread类的setDaemon()方法来创建守护线程,示…

    多线程 2023年5月17日
    00
  • Java编程一道多线程问题实例代码

    下面我来详细讲解“Java编程一道多线程问题实例代码”的完整攻略。本文将通过以下几点来介绍: 了解多线程编程的基本概念和概述; 分析多线程问题的产生原因; 实例代码的解决方案及代码实现; 针对实例代码进行测试。 多线程编程概述 多线程是指同时运行多个线程,每个线程都是独立的运行流程。在Java中,多线程编程是通过Thread类和Runnable接口实现的。J…

    多线程 2023年5月17日
    00
  • java web在高并发和分布式下实现订单号生成唯一的解决方案

    一、问题背景在高并发和分布式环境下,如果订单号生成不唯一,会涉及到多个用户可能会拥有相同的订单号,这会引发一系列的问题,如数据错误、订单混乱等,导致严重影响客户体验。 二、解决方案使用java web技术生成唯一的订单号,可以采用以下两种方案: 1.使用时间戳和随机数生成订单号订单号通常是由一定位数的时间戳和一定位数的随机数组成,可以使用系统的时间戳加上一个…

    多线程 2023年5月16日
    00
  • python基于concurrent模块实现多线程

    下面就让我来为你详细讲解Python基于concurrent模块实现多线程的完整攻略。 什么是concurrent模块 concurrent模块是Python标准库中提供的一个用于编写并发代码的模块,它包含了多种并发编程的工具和方法,其中包括了线程、进程、协程等。在本文中,我们将主要讲解如何使用concurrent模块实现多线程编程。 如何使用concurr…

    多线程 2023年5月17日
    00
  • 关于Mysql隔离级别、锁与MVCC介绍

    接下来我将为您详细讲解“关于MySQL隔离级别、锁与MVCC介绍”的完整攻略,包含以下几个方面: MySQL的隔离级别,包括四种基本的隔离级别,以及每种隔离级别所带来的影响。 MySQL的锁机制,包括共享锁(read-lock)、排他锁(write-lock)等类型的锁,以及如何判断一个操作是否需要加锁。 MySQL的MVCC机制,包括该机制的基本原理,如何…

    多线程 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部