Errno 32 kırık borusu nasıl önlenir?


121

Şu anda python'da yerleşik bir uygulama kullanıyorum. Kişisel bilgisayarda çalıştırdığımda sorunsuz çalışıyor.

Ancak, onu bir üretim sunucusuna taşıdığımda. Bana aşağıdaki ekli hatayı göstermeye devam ediyor:

Biraz araştırma yaptım ve sunucu hala veri göndermekle meşgulken son kullanıcı tarayıcısının bağlantıyı durdurmasının nedenini anladım.

Bunun neden olduğunu ve kişisel bilgisayarımda çalışırken üretim sunucusunda düzgün çalışmasını engelleyen temel nedenin ne olduğunu merak ediyorum. Herhangi bir tavsiye takdir edilmektedir

    Exception happened during processing of request from ('127.0.0.1', 34226)
Traceback (most recent call last):
  File "/usr/lib/python2.7/SocketServer.py", line 284, in
_handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 310, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python2.7/SocketServer.py", line 641, in __init__
    self.finish()
  File "/usr/lib/python2.7/SocketServer.py", line 694, in finish
    self.wfile.flush()
  File "/usr/lib/python2.7/socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe

Does bu sorunu 'çözmek'?
Pureferret

Veya uwsgi vb. İle bağlantı kurun
KyungHoon Kim

Yanıtlar:


85

Sunucu işleminiz SIGPIPEbir sokete bir yazı aldı . Bu genellikle, diğer (istemci) tarafında tamamen kapalı bir sokete yazdığınızda olur. Bu, bir istemci programı sunucudan tüm verilerin alınmasını beklemediğinde ve basitçe bir soketi kapattığında ( closeişlevi kullanarak ) gerçekleşebilir.

Bir C programında normalde SIGPIPEsinyali göz ardı etmeyi veya bunun için sahte bir sinyal işleyici ayarlamayı denersiniz . Bu durumda, kapalı bir sokete yazarken basit bir hata döndürülür. Sizin durumunuzda bir python, istemcinin erken bağlantısının kesilmesi olarak ele alınabilecek bir istisna atıyor gibi görünüyor.


2
İstemci bağlantı kesilmelerinin
üstesinden gelmekle

9

Nasıl test ettiğinize ve muhtemelen kişisel bilgisayarın ve sunucunun TCP yığın uygulamasındaki farklılıklara bağlıdır.

Örneğin sendall, kişisel bilgisayarda her zaman hemen (veya çok hızlı) tamamlanırsa, bağlantı gönderme sırasında hiçbir zaman kopmamış olabilir. Tarayıcınız aynı makinede çalışıyorsa bu çok olasıdır (çünkü gerçek bir ağ gecikmesi yoktur).


Genel olarak, istisnayı ele alarak, siz bitirmeden önce bir müşterinin bağlantısının kesildiği durumu halletmeniz yeterlidir.

TCP iletişimlerinin eşzamansız olduğunu unutmayın, ancak bu fiziksel olarak uzak bağlantılarda yerel bağlantılardan çok daha belirgindir, bu nedenle bunun gibi koşulların yerel bir iş istasyonunda yeniden üretilmesi zor olabilir. Spesifik olarak, tek bir makinedeki geridöngü bağlantıları genellikle neredeyse eşzamanlıdır.


"Paster serve abc.ini --reload" çalıştırarak test ediyorum, ancak web sayfasına asla erişilemedi. Ve VMWare İş İstasyonu için, ağ bağlantısı için yalnızca Ana Bilgisayar seçeneğini kullanıyorum. Öyleyse, onu düzgün bir şekilde çalıştırmak için herhangi bir şekilde tavsiyede bulunabilir misiniz?
SƲmmēr Aƥ

1
Bunun ayrı bir VMWare ağ yapılandırma sorusu olduğunu düşünüyorum (Korkarım bu konuda hiçbir şey bilmiyorum). İş istasyonunun ve sunucunun farklı davranmasının nedeni yukarıda belirtilmiştir ve çözüm sadece istisnayı ele try ... except
almaktır

7

Kırık kanal hatası genellikle isteğiniz engellendiğinde veya çok uzun sürdüğünde oluşur ve istek tarafı zaman aşımından sonra bağlantıyı kapatır ve ardından yanıt tarafı (sunucu) sokete yazmaya çalıştığında, bir boru kırık hatası.


3

Bunun nedeni, veritabanına veri eklemek için iki yöntem kullanıyor olmanız ve bu, sitenin yavaşlamasına neden olabilir.

def add_subscriber(request, email=None):
    if request.method == 'POST':
        email = request.POST['email_field']
        e = Subscriber.objects.create(email=email).save()  <==== 
        return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')

Yukarıdaki işlevde hata, okun işaret ettiği yerdir. Doğru uygulama aşağıdadır:

def add_subscriber(request, email=None):
    if request.method == 'POST':
        email = request.POST['email_field']
        e = Subscriber.objects.create(email=email)
        return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.