Làm thế nào để ngăn chặn ống errno 32 bị hỏng?


120

Hiện tại tôi đang sử dụng một ứng dụng được tích hợp sẵn trong python. Khi tôi chạy nó trong máy tính cá nhân, nó hoạt động mà không có vấn đề gì.

Tuy nhiên, khi tôi chuyển nó vào máy chủ sản xuất. Nó tiếp tục hiển thị cho tôi lỗi đính kèm như dưới đây:.

Tôi đã thực hiện một số nghiên cứu và tôi đã biết lý do trình duyệt của người dùng cuối dừng kết nối trong khi máy chủ vẫn đang bận gửi dữ liệu.

Tôi tự hỏi tại sao nó lại xảy ra và nguyên nhân gốc rễ ngăn nó chạy bình thường trong máy chủ sản xuất, trong khi nó hoạt động trên máy tính cá nhân của tôi. Mọi lời khuyên đều được đánh giá cao

    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

Điều này có 'giải quyết' vấn đề của bạn không?
Pureferret

Hoặc kết nối với uwsgi, v.v.
KyungHoon Kim

Câu trả lời:


85

Quá trình máy chủ của bạn đã nhận được một SIGPIPEbản ghi vào một ổ cắm. Điều này thường xảy ra khi bạn ghi vào một ổ cắm được đóng hoàn toàn ở phía bên kia (máy khách). Điều này có thể xảy ra khi một chương trình khách không đợi cho đến khi nhận được tất cả dữ liệu từ máy chủ và chỉ cần đóng một ổ cắm (sử dụng closechức năng).

Trong chương trình C, bạn thường thử đặt để bỏ qua SIGPIPEtín hiệu hoặc đặt một trình xử lý tín hiệu giả cho nó. Trong trường hợp này, một lỗi đơn giản sẽ được trả về khi ghi vào ổ cắm đã đóng. Trong trường hợp của bạn, một con trăn dường như ném ra một ngoại lệ có thể được xử lý như một sự ngắt kết nối sớm của ứng dụng khách.


2
Đây là câu trả lời hay về việc xử lý ngắt kết nối máy khách: stackoverflow.com/a/180922/276274
Maksim Skurydzin

9

Nó phụ thuộc vào cách bạn đã kiểm tra nó và có thể là sự khác biệt trong việc triển khai ngăn xếp TCP của máy tính cá nhân và máy chủ.

Ví dụ: nếu bạn sendallluôn hoàn tất ngay lập tức (hoặc rất nhanh) trên máy tính cá nhân, kết nối có thể không bao giờ bị đứt trong quá trình gửi. Điều này rất có thể xảy ra nếu trình duyệt của bạn đang chạy trên cùng một máy (vì không có độ trễ mạng thực sự).


Nói chung, bạn chỉ cần xử lý trường hợp máy khách ngắt kết nối trước khi bạn kết thúc, bằng cách xử lý ngoại lệ.

Hãy nhớ rằng truyền thông TCP là không đồng bộ, nhưng điều này rõ ràng hơn nhiều trên các kết nối vật lý từ xa so với các kết nối cục bộ, vì vậy các điều kiện như thế này có thể khó tái tạo trên một máy trạm cục bộ. Cụ thể, các kết nối loopback trên một máy thường gần như đồng bộ.


Tôi đang kiểm tra nó bằng cách chạy "paster serve abc.ini --reload", tuy nhiên không thể truy cập được trang web. Và đối với VMWare Workstation, tôi đang sử dụng tùy chọn Host-only để kết nối mạng. Vậy bạn có thể vui lòng tư vấn cách nào để chạy nó đúng cách không?
SƲmmēr Aƥ

1
Tôi nghĩ đó là một câu hỏi cấu hình mạng VMWare riêng biệt (tôi e rằng tôi không biết gì về điều đó). Tuy nhiên, lý do máy trạm và máy chủ có thể hoạt động khác nhau là ở trên và giải pháp chỉ là để xử lý ngoại lệ vớitry ... except
Vô ích

7

Lỗi đường ống bị hỏng thường xảy ra nếu yêu cầu của bạn bị chặn hoặc mất quá nhiều thời gian và sau thời gian chờ phía yêu cầu, nó sẽ đóng kết nối và sau đó, khi phía phản hồi (máy chủ) cố gắng ghi vào socket, nó sẽ ném lỗi vỡ đường ống.


3

Điều này có thể là do bạn đang sử dụng hai phương pháp để chèn dữ liệu vào cơ sở dữ liệu và điều này khiến trang web chạy chậm lại.

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

Trong chức năng trên, lỗi là nơi mũi tên đang trỏ. Cách triển khai chính xác như sau:

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('/')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.