2009-10-17 57 views
0

我想只做一個簡單的asyncore例子,其中一個套接字是發送者,一個是接收者。出於某種原因,接收器上的handle_read()永遠不會被調用,所以我從來沒有得到'測試'數據。有人知道爲什麼這是我在asyncore上的第一個鏡頭,所以它可能非常簡單。asyncore沒有運行handle_read

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

回答

1

asyncore.loop不會終止,所以a.send不會發生,因爲你已經編碼它符合發生 asyncore.loop後退出。

一旦解決了這個問題,你會遇到在單個線程和進程中運行發送者和接收者的問題,所以除非你採取非常微妙的步驟來確保以正確的順序發生,否則你將會得到僵持。 asyncore當然是爲了在單獨運行的進程中使用,所以這個問題不會出現在正常的實際應用中。如果您想了解正是你死鎖在那裏,讓自己的asyncore和胡椒它的副本打印語句,或者嘗試

python -m trace -t ast.py 

,可惜後者給出了輸出的很多並沒有按」 t顯示關鍵變量的價值。因此,儘管無痛且無創,但它比一些戰略性放置(例如,每次選擇之前和之後的r和w fd列表)的幫助少得多。我相信(但沒有深入調試過,因爲它是一個不切實際的場景)選擇只觸發一次(因爲你有接受/連接的字節寫入插座發生之前第一個選擇,他們最終「崩潰」成一個單一的事件),但處理這一事件無法知道崩潰(不會發生在正常使用! - ),所以它只處理接受/連接。但是如果您花時間進行更深入的調試,您可能會更好地理解這種異常情況!

+0

好吧,我已經添加了發送命令到發件人的handle_write函數: handle_write(self): self.send('test') 不應該在循環中運行嗎?什麼都沒發生。 – victor 2009-10-17 16:23:02

+0

您希望觸發'handle_write()'的操作是什麼?否則'send()'永遠不會被調用。 – 2009-10-17 16:45:43

+0

@victor,編輯我的答案以提供更多信息。 – 2009-10-17 16:59:17

1

很多後期,而不是解決問題的亞歷克斯指出的原因,但你的代碼所示:

def writable(self): 
    True 

難道不應該被:

def writable(self): 
    return True