Semaphore semaphore = new Semaphore(0);semaphore.release();这样是多出一个信号量?
时间: 2024-06-07 22:10:04 浏览: 130
不是多出一个信号量,而是释放了一个被占用的信号量。Semaphore 是一个计数信号量,可以控制同时访问某个资源的线程数量。调用 `release()` 方法会增加信号量的计数,表示一个资源已经被释放出来,其他线程可以继续访问该资源。在这个例子中,初始信号量的计数为 0,调用 `release()` 方法会将计数增加为 1,表示有一个资源可以被访问了。
相关问题
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
这是因为在多进程中,每个进程拥有自己独立的内存空间,所以每个进程都会创建一个自己的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对象了。
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__': manager = multiprocessing.Manager() # 指定信号量为3 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() 执行报错 FileNotFoundError: [WinError 2] 系统找不到指定的文件。
这个错误可能是因为在程序中使用了多进程,但是在Windows系统下运行多进程程序的时候,需要使用if __name__ == '__main__':来保护主程序不被子进程执行,否则会报出找不到文件的错误。
所以你需要将代码修改为:
```
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__':
manager = multiprocessing.Manager()
# 指定信号量为3
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()
```
将主程序部分放在if __name__ == '__main__':语句块中,这样就能够避免这个错误了。
阅读全文