Python多进程同步Lock、Semaphore、Event实例

  

下面就为您详细讲解Python多进程同步的Lock、Semaphore、Event实例的使用攻略。

前言

在Python中,允许我们在多个进程之间进行同步的原语,常见的有锁(Lock)、信号量(Semaphore)和事件(Event)等。这些同步机制都可以帮助我们实现在多进程环境下的协同工作。

Lock

Lock是一种基本的同步原语,可以帮助我们处理多个进程之间的访问冲突。当进行共享资源访问时,我们可以使用锁来避免多个进程同时对同一资源进行修改。在python中,Lock的使用方式是在需要同步的代码块前后加上with lock语句,这样就可以使用锁了。

示例说明

以下是一个使用Lock的示例代码,其中我们开启了五个不同的进程,但是对共享变量number的修改是通过使用锁来实现的,这样保证了对number的修改不会出现互斥问题:

import multiprocessing

def increment_number(lock, number):
    for i in range(10000):
        with lock:
            number.value += 1

if __name__ == '__main__':
    number = multiprocessing.Value('i', 0)
    lock = multiprocessing.Lock()
    processes = [multiprocessing.Process(target=increment_number, args=(lock, number)) for _ in range(5)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()
    print(number.value)

Semaphore

Semaphore是一种更加通用的同步原语,其原理与Lock类似,但是可以支持多个进程同时访问。Semaphore可以帮助我们控制并发访问数量,限制对共享资源同时进行访问的进程数。

示例说明

以下是一个使用Semaphore的示例代码,我们使用Semaphore来限制对共享变量workers的访问数量,限制了同时访问workers的进程数量不超过2个:

import multiprocessing

def worker(semaphore, worker_id):
    with semaphore:
        print(f'Worker {worker_id} is working...')
        time.sleep(1)
        print(f'Worker {worker_id} finished.')

if __name__ == '__main__':
    semaphore = multiprocessing.Semaphore(2)
    processes = [multiprocessing.Process(target=worker, args=(semaphore, i)) for i in range(5)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()

Event

Event用于进程之间的协同工作,其中一些进程可以等待在事件上,而另一些进程可以触发事件。Event对象可以用于不同进程间通信,并支持进程的同步与互斥。

示例说明

以下是一个使用Event的示例代码,我们开启了两个不同的进程,其中一个进程不停地进行数数,另一个进程则在触发事件后终止数数的操作:

import multiprocessing

def counting(event):
    i = 0
    while not event.is_set():
        i += 1
        print(i)
        time.sleep(0.5)
    print('Counting finished')

if __name__ == '__main__':
    event = multiprocessing.Event()
    counting_process = multiprocessing.Process(target=counting, args=(event,))
    counting_process.start()
    time.sleep(3)
    event.set()
    counting_process.join()

总结

在Python中,我们可以使用同步原语来保证多进程之间的协同工作。本文介绍了三种同步原语:Lock、Semaphore和Event的使用方法及示例。需要注意的是,在使用时需要特别谨慎,谨防死锁或者数据竞争的问题。

相关文章