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... 剩余信号量:{semaphore.get_value()}") 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)) workers.append(worker_process) worker_process.start() 此段代码,为什么输出3次之后信号量都是0
时间: 2024-03-12 20:47:56 浏览: 74
这是因为在多进程中,每个进程拥有自己独立的内存空间,所以每个进程都会创建一个自己的Semaphore对象。在这段代码中,你创建了10个进程,每个进程都会调用worker函数,并且每个进程都会独立地获取和释放信号量。因此,当有3个进程同时获取了信号量之后,剩余的信号量数量就变成了0,其他进程就无法再获取信号量了。
如果你想让10个进程共享同一个Semaphore对象,可以使用multiprocessing.Manager来创建一个共享对象。例如,可以这样修改代码:
```
import multiprocessing
import datetime
import time
def worker(semaphore, count):
with semaphore:
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
try:
print(f"{now}: Work {count} is working... 剩余信号量:{semaphore.get_value()}")
finally:
time.sleep(10)
if __name__ == '__main__':
# 创建共享Semaphore对象
manager = multiprocessing.Manager()
semaphores = manager.Semaphore(3)
workers = []
for i in range(10):
worker_process = multiprocessing.Process(target=worker, args=(semaphores, i))
workers.append(worker_process)
worker_process.start()
```
这样就可以让10个进程共享同一个Semaphore对象了。
阅读全文