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