Python线程通信无法正常工作

时间:2012-11-23 19:12:37

标签: python multithreading events thread-safety

我有两个线程,Reader和Writer。

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

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

我遇到的问题是,当Reader线程正在等待通过串行接口的结果时,Writer线程仍然继续读取数据。

任何人都知道为什么阻止meachnism在这两个线程之间无法正常工作?

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() 

1 个答案:

答案 0 :(得分:1)

我很确定你不应该如何使用AF_UNIX套接字。你应该打开伪文件两次(来自不同进程的相同);然后写入一边显示为另一边的读取,反之亦然。在您的代码中,您只打开一次伪文件。任何写入都可能阻塞,等待另一个进程再次打开伪文件。

在你的情况下,你应该使用socket.socketpair(),它会同时返回两个套接字,扮演两端的角色。在每个帖子中使用一端。