2012-11-23 67 views
1

我有两个线程,Reader和Writer。Python线程通信不起作用

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

你可以简化这个:把所有的工作和网络代码拿出来。现在,如果读者只是睡觉(比'askrate'秒长),然后设置事件,那么作者会发生什么?它多久醒来一次,返回什么值? – Useless

+0

好的,谢谢我会尝试。但一见钟情,一切都好看?我使用Python 3.3,如果这有所作为! – Patrick

回答

1

我敢肯定,这不是你应该如何使用AF_UNIX套接字。你应该打开伪文件两次(来自不同的进程);那么写入一侧就表现为另一侧的读取,反之亦然。在你的代码中,你只打开一次伪文件。任何写入都可能被阻塞,等待另一个进程再次打开伪文件。

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