为什么我的带有信号量的程序打印 20 秒而不是 10 秒?
Why my program with semaphore prints 20 secs instead of 10 secs?
以下是我的主要项目的简化程序。我使用 Semaphore
只允许两个进程同时执行 test
函数。如果我没疯的话,程序应该只有 10 秒 运行 时间,但我有 20 秒。我该如何修复它以将我的程序 运行 时间减少到 10 秒?
注意:在 Windows 10.
上使用 Sublime 进行了测试
import time
from multiprocessing import Semaphore, Lock, Process
def test(sem):
sem.acquire()
time.sleep(5)
sem.release()
if __name__ == '__main__':
sem = Semaphore(2)
processes = []
for _ in range(4):
processes.append(Process(target=test, args=(sem,)))
start = time.perf_counter()
for process in processes:
process.start()
process.join()
end = time.perf_counter() - start
print(f'program finished in {end} secs')
输出
program finished in 20.836512662 secs
[Finished in 21.1s]
for process in processes:
process.start()
process.join()
您正在启动每个进程,然后立即等待它完成。
那是 4 个进程,每个进程等待 5 秒。因此 20 秒。您的代码中没有实际的并行性。
您想要的是同时启动所有进程。然后等待每个完成:
for process in processes:
process.start() # start each
for process in processes:
process.join() # wait for all to finish
这导致:
program finished in 10.129543458 secs
以下是我的主要项目的简化程序。我使用 Semaphore
只允许两个进程同时执行 test
函数。如果我没疯的话,程序应该只有 10 秒 运行 时间,但我有 20 秒。我该如何修复它以将我的程序 运行 时间减少到 10 秒?
注意:在 Windows 10.
上使用 Sublime 进行了测试import time
from multiprocessing import Semaphore, Lock, Process
def test(sem):
sem.acquire()
time.sleep(5)
sem.release()
if __name__ == '__main__':
sem = Semaphore(2)
processes = []
for _ in range(4):
processes.append(Process(target=test, args=(sem,)))
start = time.perf_counter()
for process in processes:
process.start()
process.join()
end = time.perf_counter() - start
print(f'program finished in {end} secs')
输出
program finished in 20.836512662 secs
[Finished in 21.1s]
for process in processes:
process.start()
process.join()
您正在启动每个进程,然后立即等待它完成。
那是 4 个进程,每个进程等待 5 秒。因此 20 秒。您的代码中没有实际的并行性。
您想要的是同时启动所有进程。然后等待每个完成:
for process in processes:
process.start() # start each
for process in processes:
process.join() # wait for all to finish
这导致:
program finished in 10.129543458 secs