2016-05-18 15 views
0

auf nicht-blockierenden UNIX soket mit SO_SNDBUF senden I nonblocking UNIX UDP-Sockets verwenden, um Daten von einem Prozess zu einem anderen zu übertragen:BlockingIOError wenn

audio_s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) 
audio_s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 5500000) 
audio_s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 5500000) 
audio_s.setblocking(0) 
try: 
    os.remove(SOCKET_PATH) 
except FileNotFoundError as e: 
    pass 
audio_s.bind(SOCKET_PATH) 

Und ich Daten an Remote-Prozess oft senden:

audio_s.sendto(data, REMOTE_SOCKET_PATH) 

Aber manchmal (sehr selten) fange ich BlockingIOError: [Errno 11] Resource temporarily unavailable auf sendto Anruf. Welcher Grund kann dafür sein? Resource temporarily unavailable sieht wie sehr generischer Satz aus.

  1. Ist es möglich, detailliertere Informationen zu erhalten? Zum Beispiel: Sendepuffer übergelaufen vom Empfangspufferüberlauf? Sind diese möglichen Gründe? oder nur 1 von ihnen?
  2. Kann ich die aktuelle Datagrammanzahl im Sende-/Empfangspuffer kontrollieren?
  3. Was ist der richtige Weg, um diese Situation zu verarbeiten oder zu vermeiden?

Wenn ich entfernen Linie mit:

audio_s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 5500000) 

es funktioniert ohne diese Ausnahme

Antwort