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)
和{
然后f(0)
释放有界信号量5次。在这之后,我希望有界信号量的内部计数器是3(因为它是有界的),所以现在应该还有3个进程能够获取有界信号量。但是从输出来看,有界信号量的内部计数器似乎增加到了5,因为有5个进程获取了有界信号量。获取有界信号量的5个进程是f(3)
、f(5)
、f(4)
、f(7)
和{
{{14>如果一个计数器的初始值与cd15}不同,那么它是怎么可能的呢?在
来自Python2.7关于
BoundedSemaphore
的文档:https://docs.python.org/2/library/multiprocessing.html#synchronization-primitives
相关问题 更多 >
编程相关推荐