• python多进程编程


    信号量

    multiprocessing.SemaphorePython标准库multiprocessing模块中的一个类,用于实现进程间的信号量。

    信号量是一种同步原语,用于控制同时访问共享资源的进程或线程数量。它可以帮助避免竞争条件和死锁等问题。

    multiprocessing模块中,Semaphore类是通过计数器实现的。它有两个主要的方法:

    • acquire([blocking]): 获取信号量。如果计数器的值大于0,则将其减1并立即返回;如果计数器的值为0,则根据blocking参数的值决定是否阻塞等待获取信号量。默认情况下,blocking=True表示阻塞等待,直到获取到信号量为止。
    • release(): 释放信号量。将计数器的值加1。

    以下是一个使用multiprocessing.Semaphore的简单示例:

    1. from multiprocessing import Semaphore, Process
    2. import time
    3. # 创建一个信号量,最多允许2个进程同时访问临界区
    4. semaphore = Semaphore(2)
    5. def worker(name):
    6. # 请求获取信号量
    7. semaphore.acquire()
    8. print(f'{name}进程获取到了信号量')
    9. time.sleep(2) # 模拟一些工作
    10. print(f'{name}进程完成了工作')
    11. # 释放信号量
    12. semaphore.release()
    13. # 创建多个进程
    14. processes = []
    15. for i in range(5):
    16. p = Process(target=worker, args=(f'进程{i}',))
    17. processes.append(p)
    18. p.start()
    19. # 等待所有进程完成
    20. for p in processes:
    21. p.join()

    在这个示例中,我们首先创建一个Semaphore(2),表示最多允许2个进程同时访问临界区。然后定义了一个worker函数,在函数中将首先请求获取信号量,执行一些工作(这里使用time.sleep(2)模拟),然后释放信号量。

    接下来,我们创建了5个进程,并让它们调用worker函数进行工作。由于只有2个信号量可用,因此只有前两个进程可以立即获取到信号量,之后的进程需要等待前面的进程释放信号量后才能继续执行。

    最后,我们使用join方法等待所有进程完成。

    通过使用multiprocessing.Semaphore,我们可以控制并发访问共享资源的进程数量,从而避免竞争条件和其他并发问题。

    dummy

    在Python的multiprocessing模块中,dummy是一个用于创建并行处理的简单接口。然而,这个接口并不是实际的多进程处理,它只是在单个线程上模拟多进程的行为。

    以下是使用dummy的一个示例:

    1. from multiprocessing import Process, Pool, dummy as mp
    2. def square(n):
    3. return n * n
    4. if __name__ == "__main__":
    5. with mp.Pool() as pool:
    6. result = pool.map(square, range(10))
    7. print(result)

    在这个示例中,我们使用dummy来模拟多进程。我们创建了一个函数square(),然后使用pool.map()来对一个范围内的每个数字应用这个函数。这个示例会打印出0到9的平方。

    需要注意的是,虽然dummy可以模拟多进程的行为,但它并没有真正的多线程或多进程的好处。在实际的多处理任务中,你可能需要使用真正的多进程,这可以通过直接使用multiprocessing.Processmultiprocessing.Pool来实现。

    Event

    在Python的multiprocessing模块中,Event()是一个同步对象,可以用于进程之间的通步。它类似于threading.Event(),但在多进程环境中更加有用。

    Event()对象有两种状态:触发(set)和未触发(clear)。你可以使用set()方法将事件设置为触发状态,使用clear()方法将其设置为未触发状态,使用wait()方法等待事件被触发。

    下面是一个简单的示例,展示了如何使用Event()

    1. from multiprocessing import Process, Event
    2. import time
    3. def print_numbers(event):
    4. for i in range(10):
    5. print(i)
    6. time.sleep(1)
    7. if event.is_set():
    8. break
    9. if __name__ == '__main__':
    10. event = Event()
    11. p = Process(target=print_numbers, args=(event,))
    12. p.start()
    13. time.sleep(5) # Let the print_numbers() function run for a while
    14. event.set() # Trigger the event, causing print_numbers() to stop printing and exit
    15. p.join()

    在这个例子中,我们创建了一个Event对象,并使用它来控制一个多进程函数的运行。在print_numbers()函数中,我们每隔1秒打印一个数字,并检查事件是否被触发。如果事件被触发,我们停止打印并退出函数。在主程序中,我们让进程运行5秒,然后触发事件,使进程停止打印并退出。

  • 相关阅读:
    【附源码】计算机毕业设计JAVA传统文化知识竞赛系统
    摩莎(MOXA)NPort 5110串口转网口设定
    前端通用后台登录解决方案(一站式解决封装axios模块、接口请求模块、登录请求动作、本地缓存处理、登录鉴权解决)
    ECCV 2022最新研究成果:全球首个text-sketch-image数据集FS-COCO
    ant design pro git提交error; Angular 团队git提交规范
    【Verilog基础】10.偶分频和奇分频
    【算法——双指针】LeetCode 18 四数之和
    Banana Pi BPI-W3(Armsom W3)RK3588开当板之调试UART
    攻防世界-pdf
    Spring Boot与Web开发-快速开发CRUD
  • 原文地址:https://blog.csdn.net/qq_32862515/article/details/133920122