2017-08-02 22 views
2

multiprocessing.BoundedSemaphore(3)multiprocessing.Sempahore(3)とどのように異なっていますか?マルチプロセッシングの違いは何ですか。セマフォーとマルチプロセッシング。バウンドセマフォー?

私がこのセマフォを取得し、私のプロセスが誤ってセマフォに複数回(発言権を解放するまで終了していてもすることを、私は結論しmultiprocessing.BoundedSemaphore(3)はこれより3

を超え、内部カウンタ値を決して許さないだろうと期待していました一度取得して5回リリースする)、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' 

ここでは、MacOS Sierra 10.12.5のPython 2.7.13での出力を示します。以下の出力間の空白行は、出力間に一時停止を示すために私によって手動で挿入されています。

$ ./multi.py                                           [56/1853] 
f(0) acquiring ... 
f(0) acquired 
f(1) acquiring ... 
f(1) acquired 
f(2) acquiring ... 
f(2) acquired 
f(3) acquiring ... 
f(4) acquiring ... 
f(5) acquiring ... 
f(6) acquiring ... 
f(7) acquiring ... 
f(8) acquiring ... 
f(9) acquiring ... 

f(0) releasing ... 
f(0) released 
f(3) acquired 
f(5) acquired 
f(4) acquired 
f(6) acquired 
f(7) acquired 

f(1) releasing ... 
f(1) released 
f(9) acquired 
f(8) acquired 

f(2) releasing ... 
f(2) released 

f(3) releasing ... 
f(3) released 

f(4) releasing ... 
f(4) released 

f(5) releasing ... 
f(5) released 

f(6) releasing ... 
f(6) released 

f(7) releasing ... 
f(7) released 

f(8) releasing ... 
f(8) released 

f(9) releasing ... 
f(9) released 
Done 

上記出力は示していf(0)f(1)f(2)取得有界セマフォ及び境界-セマフォの内部カウンタはダウン0

に今あることを示す取得しようとしているときに残りのプロセスは、ブロック

次に、f(0)は、有界セマフォを5回解放します。その後、私はバインドされたセマフォの内部カウンタが3になることを期待していたので、今度はさらに3つのプロセスがバインドされたセマフォを取得できるはずです。しかし出力からは、5つのプロセスが有界セマフォを取得するため、有界セマフォの内部カウンタが5に増加したように見えます。有界セマフォを取得する5つのプロセスは、f(3),f(5),f(4),f(7)およびf(7)です。

multiprocessing.BoundedSemaphoreオブジェクトの内部カウンタが初期値を超える可能性がある場合は、multiprocessing.Semaphoreとどのように違いますか? Pythonの2.7のドキュメントから

答えて

1

についてBoundedSemaphore

Note On Mac OS X, this is indistinguishable from Semaphore because sem_getvalue() is not implemented on that platform.

https://docs.python.org/2/library/multiprocessing.html#synchronization-primitives

+0

ありがとう!私はLinux上で同じプログラムを走らせて、4番目の 'sem.release()'コールが本当に 'ValueError:セマフォーやロックのリリース回数が多すぎる'につながっていることがわかります。 –

関連する問題