有什么区别多处理信号量以及多处理.BoundedSemaphore?

2024-09-27 21:25:57 发布

您现在位置:Python中文网/ 问答频道 /正文

multiprocessing.BoundedSemaphore(3)与{}有何不同?在

我希望multiprocessing.BoundedSemaphore(3)永远不会允许其内部计数器值超过3。在

由此,我得出结论,即使获取该信号量的进程最终错误地释放了一次以上的信号量(比如说获取了一次信号量,但释放了它五次),在任何时候都不允许超过3个进程获取该信号量。然而,我的这个结论似乎是不正确的。在

这是我的Python示例代码,位于一个名为multi.py的文件中。在

#!/usr/bin/env python
import multiprocessing
import time

def f(i, sem):
    print 'f(%d) acquiring ...' % i
    sem.acquire()
    print 'f(%d) acquired' % i

    time.sleep(i + 1)

    print 'f(%d) releasing ...' % i
    sem.release()
    sem.release() # Extra release on purpose
    sem.release() # Extra release on purpose
    sem.release() # Extra release on purpose
    sem.release() # Extra release on purpose
    print 'f(%d) released' % i

processes = []

sem = multiprocessing.BoundedSemaphore(3)
for i in range(10):
    p = multiprocessing.Process(target=f, args=(i, sem))
    p.start()
    processes.append(p)

for p in processes:
    p.join()

print 'Done'

下面是我的macossierra 10.12.5和python2.7.13的输出。下面输出之间的空白行由我手动插入,以指示输出之间的暂停。在

^{pr2}$

上面的输出显示,f(0)f(1)和{}获取有界信号量和剩余进程块,同时尝试获取表示有界信号量的内部计数器现在已降至0。在

然后f(0)释放有界信号量5次。在这之后,我希望有界信号量的内部计数器是3(因为它是有界的),所以现在应该还有3个进程能够获取有界信号量。但是从输出来看,有界信号量的内部计数器似乎增加到了5,因为有5个进程获取了有界信号量。获取有界信号量的5个进程是f(3)f(5)f(4)f(7)和{}。在

{{14>如果一个计数器的初始值与cd15}不同,那么它是怎么可能的呢?在


Tags: importforreleasetime进程on计数器multiprocessing

热门问题