2016-10-23 1 views
0

私はpython twisted libraryを使用しています。受信したデータに対して何らかの処理を行い、接続を閉じるためにデータを受信するサーバーを作っています。私は、プログラムがprintステートメントなしでdataReceivedにハングするのを観察します。 printステートメントでそれは通過します。競合状態を避けるために印刷が何とか実行速度を低下させるか、バグをコード化したかどうかわかりませんか?次のようにTwisted dataReceived hangs

私のコードは次のとおりです。

class Stack(Protocol): 
    def __init__(self, factory): 
    self.factory = factory 
    self.bytesremaining = None 
    self.payload = "" 
    self.headerseen = False 
    def dataReceived(self, data): 
    if self.headerseen == False: 
      header = unpack('B',data[0])[0] 
      if header == 128: 
        self.pop() 
        return 
      self.bytesremaining = self.datalength = unpack('B',data[0])[0] 
      print self.datalength #without this print the execution hangs in the middle. 
      if len(data) > 1 and (len(self.factory.pushstack) < 100): 
        self.payload += data[1:] 
        self.bytesremaining -= len(data) - 1 
      self.headerseen = True 
    elif len(self.factory.pushstack) < 100: 
      self.payload += data 
      self.bytesremaining -= len(data) - 1 
    if self.bytesremaining == 0: 
      self.factory.pushstack.appendleft(self.payload) 
      retval = pack('B',0) 
      self.transport.write(retval) 
      self.transport.loseConnection() 

class StackFactory(ServerFactory): 
    def __init__(self): 
    self.clients = [] 
    self.pushstack = collections.deque() 
    self.popstack = collections.deque() 
    self.clientsmap = {} 

    def buildProtocol(self, addr): 
    return Stack(self) 

答えて

1

OS Xのデフォルトのねじれリアクター(selectreactor)はkqueueのほど安定していないように私には見えます。

kqueue reactorをインストールしても問題は解決しません。

from twisted.internet import kqreactor 
kqreactor.install() 
from twisted.internet import reactor