asyncore没有运行handle_read

时间:2009-10-17 16:16:07

标签: python asyncore

我试图制作一个简单的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')

2 个答案:

答案 0 :(得分:1)

asyncore.loop没有终止,所以a.send没有发生,因为你已经将它编码为在退出asyncore.loop之后的行。< / p>

一旦解决了这个问题,你就遇到了在一个线程和进程中运行发送方和接收方的问题,所以除非你采取非常微妙的步骤来确保一切都以正确的顺序发生,否则你将陷入僵局。 asyncore当然意味着在单独运行的进程中使用,因此问题不会出现在正常的实际使用中。如果你对你死锁的确切位置感到好奇,那就制作你自己的asyncore副本并用打印语句加注它,或者试试

python -m trace -t ast.py

不幸的是,后者给出了 lot 的输出,并没有显示关键变量的值。因此,虽然尝试无痛且无创,但它远没有一些策略性地放置print(例如,每次选择之前和之后的r和w fd列表)。

我相信(但是没有深入调试它,因为这是一个不切实际的场景),select只触发一次(因为你有accept / connect 写入字节到套接字在第一次选择之前发生,它们最终“折叠”成单个事件),但是那个事件的处理无法知道崩溃(在正常使用中不会发生! - )所以它只处理接受/连接。但如果你花时间进行更深入的调试,你无疑会更好地理解这种异常情况!

答案 1 :(得分:1)

很晚才解决问题,因为Alex指出原因,但你的代码显示:

def writable(self):
     True 

不应该是:

def writable(self):
     return True