我试图制作一个简单的asyncore示例,其中一个套接字是发送方,一个是接收方。由于某种原因,接收器上的handle_read()永远不会被调用,所以我永远不会得到'test'数据。谁知道为什么?这是我在asyncore的第一次拍摄,所以它可能非常简单。
import asyncore, socket, pdb, random
class Sender(asyncore.dispatcher):
def __init__(self):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
def handle_connect(self):
print ('first connect')
def writable(self):
True
def readable(self):
return False
def handle_write(self):
pass
def handle_close(self):
self.close()
class Receiver(asyncore.dispatcher):
def __init__(self):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
def handle_connect(self):
print ('first connect')
def readable(self):
return True
def handle_read(self):
print 'reading'
def handle_write(self):
print 'write'
def handle_accept(self):
self.conn_sock, addr = self.accept()
print 'accepted'
def handle_close(self):
self.close()
a = Sender()
b = Receiver()
addr = ('localhost', 12344)
b.bind(addr)
b.listen(1)
a.connect(addr)
asyncore.loop()
a.send('test')
答案 0 :(得分:1)
一旦解决了这个问题,你就遇到了在一个线程和进程中运行发送方和接收方的问题,所以除非你采取非常微妙的步骤来确保一切都以正确的顺序发生,否则你将陷入僵局。 asyncore当然意味着在单独运行的进程中使用,因此问题不会出现在正常的实际使用中。如果你对你死锁的确切位置感到好奇,那就制作你自己的asyncore副本并用打印语句加注它,或者试试 不幸的是,后者给出了 lot 的输出,并没有显示关键变量的值。因此,虽然尝试无痛且无创,但它远没有一些策略性地放置 我相信(但是没有深入调试它,因为这是一个不切实际的场景),select只触发一次(因为你有accept / connect 和写入字节到套接字在第一次选择之前发生,它们最终“折叠”成单个事件),但是那个事件的处理无法知道崩溃(在正常使用中不会发生! - )所以它只处理接受/连接。但如果你花时间进行更深入的调试,你无疑会更好地理解这种异常情况!asyncore.loop
没有终止,所以a.send
没有发生,因为你已经将它编码为在退出asyncore.loop之后的行。< / p>
python -m trace -t ast.py
print
(例如,每次选择之前和之后的r和w fd列表)。
答案 1 :(得分:1)
很晚才解决问题,因为Alex指出原因,但你的代码显示:
def writable(self):
True
不应该是:
def writable(self):
return True