2016-05-19 3 views
0

私はセマフォをPythonで動作させようとしていますが、何らかの理由で彼らが望むように動作しません。 私は彼らのような一度に一つの番号を印刷したいと思います:セマフォの出力が間違っています

sem1: 1 
wait 
sem2: 2 
wait 
sem1: 3 
wait 
sem2: 4 

が、出力は次のようである:

sem1: 1 
sem2: 2 
wait 
sem1: 3 
sem2: 4 

が、これは私のコードです:

import os, multiprocessing, time 

sem1 = multiprocessing.Semaphore(1) 
sem2 = multiprocessing.Semaphore(0) 

pid1 = os.fork() 
pid2 = -1 

if pid1 != 0: 
    pid2 = os.fork() 
for i in range(1,20): 
    if (i%2) == 1 and pid1==0: 
      sem1.acquire() 
      print("sem1: %d" %i) 
      sem2.release() 
      time.sleep(1) 
    elif (i%2) == 0 and pid2==0: 
      sem2.acquire() 
      print("sem2: %d" %i) 
      sem1.release() 
      time.sleep(1) 

私が作っています私の考えで間違い?

+0

一緒に待たないでください。 'time.sleep'のように1つのプロセスだけをスリープさせるので、両方とも最初のステップを待ってから待ってから、2つ目のステップを待ってください。 –

+0

なぜ' os.fork'を使用していますか?プロセスの作成に 'multiprocessing'モジュールの機能を使うべきではありませんか?ドキュメンテーションは、 'multiprocessing'モジュールが手動フォークとどのように相互作用するかについて何も言及していません。 – user2357112

答えて

0

time.sleep()は、機能を達成するために親プロセスから呼び出す必要があります。以下の変更されたコードで、私は、これはあなたが望む方法であると信じて:

import os, multiprocessing, time 

sem1 = multiprocessing.Semaphore(1) 
sem2 = multiprocessing.Semaphore(0) 

pid1 = os.fork() 
pid2 = -1 

if pid1 != 0: 
    pid2 = os.fork() 
for i in range(1,20): 
    time.sleep(1) 
    if (i%2) == 1 and pid1==0: 
      sem1.acquire() 
      print("sem1: %d" %i) 
      sem2.release() 
      #time.sleep(1) 
    elif (i%2) == 0 and pid2==0: 
      sem2.acquire() 
      print("sem2: %d" %i) 
      sem1.release() 
      #time.sleep(1) 

は出力:

SEM1:

を待つ

2:1

SEM2を待ちます

sem1:3

SEM2待って:あなたは、個々の子プロセスをtime.sleep(1)を使用している場合は

、唯一その子プロセスは親プロセスがない眠る:4

推論を待ちます。 iが奇数の場合、それに対応する子プロセスが印刷してスリープ状態になりますが、親プロセスはまだアクティブであり、iが偶数の場合は子プロセスを実行します。 iが増加し、再び眠りに行くと、スリープサイクルが完了するまで待機します。親にthread.sleep(1)と呼ぶと、それぞれiの値を待ちます。

+0

ありがとう!ループの先頭に置くのではなく、最初に印刷してから待つようにします –

+0

さて、親プロセスからキーを呼び出す必要があります。 – PseudoAj

関連する問題