import multiprocessing import datetime import time def worker(semaphore, count): semaphore.acquire() now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') try: print(f"{now}: Work {count} is working...") finally: time.sleep(10) semaphore.release() if __name__ == '__main__': # 指定信号量为3 semaphores = multiprocessing.Semaphore(3) workers = [] for i in range(10): worker_process = multiprocessing.Process(target=worker, args=(semaphores, i)) # 获取当前剩余的信号量 print(f"剩余信号量:{semaphores.value}") workers.append(worker_process) worker_process.start()
时间: 2024-04-24 12:22:39 浏览: 126
Python多进程multiprocessing.Pool类详解
5星 · 资源好评率100%
这段代码是一个使用`multiprocessing.Semaphore`实现进程间同步的示例。首先,我们定义了一个`worker`函数,其中`semaphore`参数是一个`multiprocessing.Semaphore`对象,用于控制并发访问的数量。在`worker`函数中,我们首先调用`semaphore.acquire()`方法获取一个信号量,表示当前进程需要占用一个资源。然后,我们打印当前进程的工作编号和时间,并在`finally`块中释放信号量,表示当前进程已经完成了任务,可以让其他进程获取资源。在释放信号量之前,我们使用`time.sleep(10)`模拟当前进程正在处理任务的过程。
在`if __name__ == '__main__':`块中,我们首先定义了一个初始值为3的信号量对象`semaphores`,表示最多只能有3个进程同时访问共享资源。然后,我们创建10个进程,每个进程都调用`worker`函数,并传入`semaphores`作为参数。在创建进程之前,我们使用`semaphores.value`获取当前剩余的信号量数量,并打印出来,以便观察。最后,我们启动所有进程,让它们并发执行。
需要注意的是,由于`multiprocessing.Semaphore`是进程间同步的机制,因此在`if __name__ == '__main__':`块中创建的`semaphores`对象和`worker`函数中传入的`semaphores`对象并不是同一个对象,而是通过进程间通信实现的。
阅读全文