• 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基础考试题,来测试下自己能拿多少分?提供答案
    【面试题】这道 JS 经典面试题不要背!今天帮你彻底搞懂它
    使用qrcode.js生成二维码
    FruitJuice for Mac:智能优化电池寿命,Mac持久续航不再难!
    解决js代码中加入alert就成功执行请求接口,不加就不执行的问题
    数据结构
    1.centos7安装docker
    面食有哪些 面食的种类大全
    前端三件套速成
  • 原文地址:https://blog.csdn.net/qq_32862515/article/details/133920122