2010-07-18 100 views
1

我正在研究一個扭曲的教程,以瞭解更多的python,看來我已經跑到了這裏的路障。下面的doRead()函數是反應器的「回調」。我不明白的是除了部分是如何工作的。扭曲的回調函數混淆

我閱讀代碼的方式是,如果bytes += self.sock.recv(1024)就已經引起了塊,然後它會到達代碼的以下部分:

if e.args[0] == errno.EWOULDBLOCK: 
    break 

然後,它會一直持續到以下幾點:

if not bytes: 
    print 'Task %d finished' % self.task_num 
    return main.CONNECTION_DONE 
else: 
    msg = 'Task %d: got %d bytes of poetry from %s' 
    print msg % (self.task_num, len(bytes), self.format_addr()) 

對我來說,棘手的部分是,如果它阻塞,那麼字節變量將不會包含任何內容,並會打印「完成」,但它不會。或者至少它會打印出像「有0個字節」的東西,但它也沒有。在我看來,當代碼遇到來自recv調用的塊時,它完全跳過了上面的部分。有人可以解釋爲什麼會這樣嗎?

輸出是這樣的:

Task 1: got 30 bytes of poetry from 127.0.0.1:10000 
Task 3: got 10 bytes of poetry from 127.0.0.1:10002 
Task 1: got 30 bytes of poetry from 127.0.0.1:10000 
Task 3: got 10 bytes of poetry from 127.0.0.1:10002 
Task 1: got 30 bytes of poetry from 127.0.0.1:10000 
Task 3: got 3 bytes of poetry from 127.0.0.1:10002 
Task 1: got 30 bytes of poetry from 127.0.0.1:10000 

這是整個功能:

def doRead(self): 
    bytes = '' 

    while True: 
     try: 
      bytes += self.sock.recv(1024) 
      if not bytes: 
       break 
     except socket.error, e: # I don't understand this part 
      if e.args[0] == errno.EWOULDBLOCK: 
       break 
      return main.CONNECTION_LOST 

    if not bytes: 
     print 'Task %d finished' % self.task_num 
     return main.CONNECTION_DONE 
    else: 
     msg = 'Task %d: got %d bytes of poetry from %s' 
     print msg % (self.task_num, len(bytes), self.format_addr()) 

    self.poem += bytes 

整個模塊粘貼在這裏:http://pastebin.com/bUnXgbCA

+0

我無法重現您的結果。當我將代碼連接到服務器時,當服務器斷開連接時,將打印「已完成」。你確定你連接的服務器實際上關閉了連接嗎? 此外,你知道這個應用程序會更好地實現爲協議,而不是IReadDescriptor,對嗎? – 2010-07-18 15:44:44

回答

2

的一點是,方法doRead被調用only當套接字「準備好讀取」時:或者它有一些數據,或者el這一切都完成了(然後,閱讀將返回0)。因此,對於您的問題的解決方案不能在doRead函數中 - 只有在適當的時候,代碼纔會調用

該代碼全部在Twisted「reactor」中,PoetrySocket的實例將其自身添加到__init__中(通過反應器的addReader方法)。如果你想了解真正的非合作深度的扭曲的機制,順便說一句,你看起來是在正確的位置(當然是研究扭曲的來源自己的網絡;-)。

+0

感謝您回覆Alex。我並不是真的想解決任何問題,只是試圖瞭解它是如何工作的。我仍然不確定在except塊中的break語句之後會發生什麼,因爲它似乎根本沒有達到「if not bytes:」塊。 – 2010-07-18 04:13:46

+0

@Joseph,所以它從來沒有被調用(在你的實驗中)的套接字錯誤(這將返回有問題的條件),但只有當對方「掛斷」(連接丟失)時纔會被調用。 – 2010-07-18 04:46:17