কিভাবে 32 টি ভাঙা পাইপ errno রোধ করতে?


120

বর্তমানে আমি পাইথনে নির্মিত একটি অ্যাপ ব্যবহার করছি। আমি যখন এটি ব্যক্তিগত কম্পিউটারে চালিত করি, এটি সমস্যা ছাড়াই কাজ করে।

যাইহোক, আমি যখন এটি একটি প্রোডাকশন সার্ভারে স্থানান্তর করি। এটি আমাকে নীচের মতো সংযুক্ত ত্রুটিটি দেখায়:

আমি কিছু গবেষণা করেছি এবং সার্ভারটি এখনও ডেটা প্রেরণে ব্যস্ত থাকাকালীন শেষ ব্যবহারকারী ব্রাউজারটি সংযোগ বন্ধ করে দেওয়ার কারণটি পেয়েছি।

আমি অবাক হয়েছি কেন এটি ঘটেছিল এবং মূল কারণটি যা এটি প্রোডাকশন সার্ভারে সঠিকভাবে চালানো থেকে বাধা দেয়, যখন এটি আমার ব্যক্তিগত কম্পিউটারে কাজ করে। কোন পরামর্শ প্রশংসা করা হয়

    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

না এই 'সমাধান' আপনার সমস্যা?
পিওরফেরেট

বা উউসগি ইত্যাদির সাথে সংযুক্ত হন
কিংহুন কিম

উত্তর:


85

আপনার সার্ভার প্রক্রিয়াটি SIGPIPEএকটি সকেটে একটি লেখা পেয়েছে । এটি সাধারণত তখন ঘটে যখন আপনি কোনও সকেটে অন্য (ক্লায়েন্ট) দিকে সম্পূর্ণ বন্ধ হয়ে লিখবেন। সার্ভারের সমস্ত ডেটা না পাওয়া পর্যন্ত ক্লায়েন্ট প্রোগ্রামটি অপেক্ষা না করে এবং কেবল একটি সকেট বন্ধ করে ( closeফাংশন ব্যবহার করে) এটি ঘটতে পারে ।

কোনও সি প্রোগ্রামে আপনি সাধারণত SIGPIPEসিগন্যাল উপেক্ষা করার জন্য সেট করার চেষ্টা করবেন বা এর জন্য একটি ডামি সিগন্যাল হ্যান্ডলার স্থাপন করবেন। এই ক্ষেত্রে বন্ধ সকেটে লেখার সময় একটি সাধারণ ত্রুটি ফিরে আসবে। আপনার ক্ষেত্রে অজগরটি একটি ব্যতিক্রম ছুঁড়ে বলে মনে হচ্ছে যা ক্লায়েন্টের অকাল বিচ্ছিন্ন হিসাবে পরিচালনা করতে পারে।


2
: এখানে হ্যান্ডলিং ক্লায়েন্ট disconnects সম্বন্ধে একটি ভাল উত্তর stackoverflow.com/a/180922/276274
মাক্সিম Skurydzin

9

এটি আপনি কীভাবে এটি পরীক্ষা করেছেন এবং ব্যক্তিগত কম্পিউটার এবং সার্ভারের টিসিপি স্ট্যাক প্রয়োগের মধ্যে পার্থক্যের উপর নির্ভর করে।

উদাহরণস্বরূপ, যদি আপনার sendallব্যক্তিগত কম্পিউটারে সর্বদা তাত্ক্ষণিকভাবে (বা খুব দ্রুত) সম্পূর্ণ হয় তবে প্রেরণের সময় সংযোগটি কখনও ভেঙে যেতে পারে না। আপনার ব্রাউজারটি একই মেশিনে চলমান থাকলে (সম্ভবত কোনও সত্যিকারের নেটওয়ার্কের বিলম্ব নেই) This


সাধারণভাবে, আপনাকে কেবল কেসটি পরিচালনা করতে হবে যেখানে কোনও ক্লায়েন্ট ব্যতিক্রমটি পরিচালনা করার আগে সংযোগ বিচ্ছিন্ন করে দেয়।

মনে রাখবেন যে টিসিপি যোগাযোগগুলি অ্যাসিনক্রোনাস। বিশেষত, একটি একক মেশিনে লুপব্যাক সংযোগগুলি প্রায়শই প্রায় সমকালীন হয়।


আমি "পাস্তারের পরিবেশন abc.ini --reload" চালিয়ে এটি পরীক্ষা করছি, তবে ওয়েবপৃষ্ঠায় কখনও পৌঁছানো যায়নি। এবং ভিএমওয়্যার ওয়ার্কস্টেশনের জন্য, আমি নেটওয়ার্ক সংযোগের জন্য হোস্ট-ওয়াল বিকল্পটি ব্যবহার করছি। সুতরাং আপনি কি দয়া করে কোনওভাবে এটি সঠিকভাবে চালানোর জন্য পরামর্শ দিতে পারেন?
সোমবার আঃ

1
আমি মনে করি এটি একটি পৃথক ভিএমওয়্যার নেটওয়ার্ক কনফিগারেশন প্রশ্ন (আমি ভয় করি যে আমি সে সম্পর্কে কিছুই জানি না)। কারণ ওয়ার্কস্টেশন এবং সার্ভারের না হতে পারে যদিও উপরে, এবং সমাধান শুধু সঙ্গে ব্যতিক্রম হ্যান্ডেল হয়try ... except
বেহুদা

7

ভাঙ্গা পাইপের ত্রুটিটি সাধারণত ঘটে যদি আপনার অনুরোধটি অবরুদ্ধ থাকে বা খুব বেশি সময় নেয় এবং অনুরোধের পাশের সময়সীমা শেষ হওয়ার পরে, এটি সংযোগটি বন্ধ করে দেবে এবং তারপরে, যখন প্রতিক্রিয়া সাইড (সার্ভার) সকেটে লেখার চেষ্টা করবে, তখন এটি নিক্ষেপ করবে পাইপ ভাঙ্গা ত্রুটি।


3

এটি হতে পারে কারণ আপনি ডাটাবেসে ডেটা forোকানোর জন্য দুটি পদ্ধতি ব্যবহার করছেন এবং এর ফলে সাইটটি ধীর হয়ে যায়।

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

উপরের ফাংশনে, ত্রুটিটি যেখানে তীরটি নির্দেশ করছে। সঠিক বাস্তবায়ন নীচে:

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('/')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.