1

Reader と Writer の 2 つのスレッドがあります。

ライターはネットワークからデータを取得し、ソケットを介して実行可能ファイルに送信します。これが完了すると、ライターは Event.wait(askrate) で指定した最大 70 秒をブロックする必要があります。

これにより、実行可能ファイルが結果を計算して出力を送信するのに十分な時間が与えられます。計算が終了したら、Event.set() を使用して Writer スレッドのロックを解放し、実行可能ファイルなどに転送される次のデータを読み取ることができるようにしました。

私が抱えている問題は、リーダー スレッドがシリアル インターフェイスからの結果を待っている間、ライター スレッドがまだデータを読み続けていることです。

このブロッキングメカニズムがこれらの2つのスレッド間でうまく機能しない理由を知っている人はいますか?

askrate = 70

s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/tmp/demo_socket")

class Reader(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True

    def run(self):
        while True:            
            nonce = s.recv(4)            
            if len(nonce) == 4:
                submitter = Submitter(writer.block, nonce)
                #submit result and release thread lock in Writer class 
                golden.set()

class Writer(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True

    def run(self):
        while True:
          work = bc.getwork()                
          self.block = work['data']
          self.midstate = work['midstate']

          payload = self.midstate.decode('hex') + self.block.decode('hex')
          s.send(payload)
          result = golden.wait(askrate)

          if result:
             golden.clear()


golden = Event()

reader = Reader()
writer = Writer()

reader.start()
writer.start() 
4

1 に答える 1

1

AF_UNIX ソケットを使用する方法ではないことは確かです。疑似ファイルを(異なるプロセスの同じものから)2回開くことになっています。一方の側への書き込みは、もう一方の側では読み取りとして表示され、その逆も同様です。コードでは、疑似ファイルを 1 回だけ開きます。書き込みはおそらくブロックされており、別のプロセスが疑似ファイルをもう一度開くのを待っています。

あなたの場合、socket.socketpair() を使用する必要があります。これは、2 つのソケットを一度に返し、両端の役割を果たします。各スレッドの一方の端を使用します。

于 2012-11-24T10:13:30.417 に答える