我有两个线程,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()
答案 0 :(得分:1)
我很确定你不应该如何使用AF_UNIX套接字。你应该打开伪文件两次(来自不同进程的相同);然后写入一边显示为另一边的读取,反之亦然。在您的代码中,您只打开一次伪文件。任何写入都可能阻塞,等待另一个进程再次打开伪文件。
在你的情况下,你应该使用socket.socketpair(),它会同时返回两个套接字,扮演两端的角色。在每个帖子中使用一端。