1

我有两个线程,Reader 和 Writer。

Writer 从网络获取数据,然后通过套接字将其发送到某个可执行文件。完成此操作后,作者应阻止最多 70 秒,我使用 Event.wait(askrate) 指定。

这应该给可执行文件足够的时间来计算结果,然后提交输出。如果计算完成,我使用 Event.set() 来释放 Writer 线程上的锁,以便它可以读取下一个被转发到可执行文件的数据,依此类推。

我遇到的问题是,Writer 线程仍在继续读取数据,而 Reader 线程正在等待来自串行接口的结果。

有人知道为什么这种阻塞机制在这两个线程之间不能正常工作吗?

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 套接字的方式。您应该打开伪文件两次(来自不同进程的相同);然后写入一侧显示为另一侧的读取,反之亦然。在您的代码中,您只打开一次伪文件。任何写入都可能被阻塞,等待另一个进程第二次打开伪文件。

在您的情况下,您应该使用 socket.socketpair(),它一次返回两个套接字,扮演两端的角色。在每个线程中使用一个末端。

于 2012-11-24T10:13:30.417 回答