【问题标题】:Why my program with semaphore prints 20 secs instead of 10 secs?为什么我的信号量程序打印 20 秒而不是 10 秒?
【发布时间】:2021-12-19 18:07:50
【问题描述】:

以下是我的主要项目中的简化程序。我使用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]

【问题讨论】:

  • process.join() 正在等待当前进程结束...在启动第二个等之后...然后等待 5,5,5,5

标签: python python-3.x multiprocessing semaphore


【解决方案1】:
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

【讨论】:

    猜你喜欢
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2022-12-15
    • 2019-02-14
    • 1970-01-01
    相关资源
    最近更新 更多