Bagaimana cara mencegah pipa errno 32 rusak?


120

Saat ini saya menggunakan aplikasi bawaan python. Ketika saya menjalankannya di komputer pribadi, ini bekerja tanpa masalah.

Namun, ketika saya memindahkannya ke server produksi. Itu terus menunjukkan kepada saya kesalahan yang dilampirkan seperti di bawah ini:.

Saya telah melakukan beberapa penelitian dan saya mendapat alasan bahwa browser pengguna akhir menghentikan koneksi saat server masih sibuk mengirim data.

Saya bertanya-tanya mengapa itu terjadi dan apa akar penyebab yang mencegahnya berjalan dengan baik di server produksi, sementara itu berfungsi di komputer pribadi saya. Setiap saran dihargai

    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

Apakah ini 'menyelesaikan' masalah Anda?
Pureferret

Atau terhubung dengan uwsgi, dll.
KyungHoon Kim

Jawaban:


85

Proses server Anda telah menerima SIGPIPEtulisan ke soket. Ini biasanya terjadi ketika Anda menulis ke soket yang tertutup sepenuhnya di sisi (klien) lainnya. Ini mungkin terjadi ketika program klien tidak menunggu sampai semua data dari server diterima dan hanya menutup soket (menggunakan closefungsi).

Dalam program C Anda biasanya mencoba mengatur untuk mengabaikan SIGPIPEsinyal atau mengatur penangan sinyal tiruan untuk itu. Dalam hal ini kesalahan sederhana akan dikembalikan saat menulis ke soket tertutup. Dalam kasus Anda, python tampaknya melempar pengecualian yang dapat ditangani sebagai pemutusan hubungan klien secara prematur.


2
Berikut adalah jawaban yang bagus tentang menangani pemutusan klien: stackoverflow.com/a/180922/276274
Maksim Skurydzin

9

Itu tergantung pada bagaimana Anda mengujinya, dan mungkin pada perbedaan dalam implementasi tumpukan TCP komputer pribadi dan server.

Misalnya, jika Anda sendallselalu menyelesaikan dengan segera (atau sangat cepat) di komputer pribadi, koneksi mungkin tidak pernah putus selama pengiriman. Ini sangat mungkin terjadi jika browser Anda berjalan di komputer yang sama (karena tidak ada latensi jaringan yang sebenarnya).


Secara umum, Anda hanya perlu menangani kasus di mana klien terputus sebelum Anda selesai, dengan menangani pengecualian.

Ingatlah bahwa komunikasi TCP bersifat asinkron, tetapi ini jauh lebih jelas pada koneksi jarak jauh secara fisik daripada pada koneksi lokal, jadi kondisi seperti ini mungkin sulit untuk mereproduksi pada workstation lokal. Secara khusus, koneksi loopback pada satu mesin seringkali hampir sinkron.


Saya mengujinya dengan menjalankan "paster serve abc.ini --reload", namun halaman web tidak dapat dijangkau. Dan untuk VMWare Workstation, saya menggunakan opsi Host-only untuk koneksi jaringan. Jadi dapatkah Anda dengan ramah menyarankan cara apa pun untuk menjalankannya dengan benar?
SƲmmēr Aƥ

1
Saya pikir itu adalah pertanyaan konfigurasi jaringan VMWare yang terpisah (saya khawatir saya tidak tahu apa-apa tentang itu). The Alasan workstation dan server dapat berperilaku berbeda di atas meskipun, dan solusi hanya untuk menangani pengecualian dengantry ... except
Useless

7

Kesalahan pipa rusak biasanya terjadi jika permintaan Anda diblokir atau memakan waktu terlalu lama dan setelah waktu tunggu sisi permintaan, itu akan menutup koneksi dan kemudian, ketika sisi-tanggapan (server) mencoba untuk menulis ke soket, itu akan melempar kesalahan pipa rusak.


3

Ini mungkin karena Anda menggunakan dua metode untuk memasukkan data ke dalam database dan ini menyebabkan situs menjadi lambat.

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

Dalam fungsi di atas, kesalahannya adalah di mana panah menunjuk. Implementasi yang benar ada di bawah ini:

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('/')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.