অজগর অনুরোধগুলির জন্য সময়সীমা শেষ করুন entire সম্পূর্ণ প্রতিক্রিয়া জানুন


169

আমি ওয়েবসাইটের তালিকায় পরিসংখ্যান সংগ্রহ করছি এবং আমি সরলতার জন্য এর জন্য অনুরোধগুলি ব্যবহার করছি। আমার কোডটি এখানে:

data=[]
websites=['http://google.com', 'http://bbc.co.uk']
for w in websites:
    r= requests.get(w, verify=False)
    data.append( (r.url, len(r.content), r.elapsed.total_seconds(), str([(l.status_code, l.url) for l in r.history]), str(r.headers.items()), str(r.cookies.items())) )

এখন, আমি requests.get10 সেকেন্ড পরে টাইমআউট করতে চাই যাতে লুপটি আটকে না যায়।

এই প্রশ্নটি আগেও আগ্রহী ছিল তবে উত্তরগুলির কোনওটিই পরিষ্কার নয়। একটি সুন্দর উত্তর পেতে আমি এটিতে কিছু পরিমাণ অনুগ্রহ করব।

আমি শুনেছি সম্ভবত অনুরোধগুলি ব্যবহার না করা একটি ভাল ধারণা তবে তবে কীভাবে আমার কাছে সুন্দর জিনিসগুলির অনুরোধের অফার পাওয়া উচিত। (টিপলে থাকা)


1
আপনি কি ধরনের উত্তর খুঁজছেন? (বা, অন্য কথায়, বর্তমান উত্তরগুলি আপনার পক্ষে পর্যাপ্ত নয় কেন?)
যুভি

আমরা অনুগ্রহের অনুগ্রহকালীন সময়ে আছি। একটি উত্তর চয়ন করার সময়?
টোটোকাকা

আমি এখনও ইভেন্টলেট সমাধান এবং সংকেতগুলির মধ্যে সিদ্ধান্ত নিচ্ছি। আমি আজ রাতের মধ্যে প্রশ্ন পুরস্কৃত করব।
কিআরশ


উত্তর:


137

ইভেন্টলেটলেট ব্যবহার সম্পর্কে কী? আপনি যদি 10 সেকেন্ডের পরে অনুরোধটি শেষ করতে চান, এমনকি যদি ডেটা পাওয়া যায়, এই স্নিপেটটি আপনার জন্য কাজ করবে:

import requests
import eventlet
eventlet.monkey_patch()

with eventlet.Timeout(10):
    requests.get("http://ipv4.download.thinkbroadband.com/1GB.zip", verify=False)

114
অবশ্যই এটি অযথা জটিল।
হোল্ডেনওয়েব

7
ধন্যবাদ. আমি এখন আপনার সমাধানটির প্রযুক্তিগত শ্রেষ্ঠত্ব বুঝতে পেরেছি (যা আপনি নিজের উত্তরের শুরুতে সংজ্ঞায়িতভাবে বলেছেন) এবং এটির উন্নতি করেছি। তৃতীয় পক্ষের মডিউলগুলির সাথে সমস্যাটি সেগুলি আমদানি করছে না তবে তারা আমদানি করার বিষয়টি নিশ্চিত করছে, তাই যেখানে সম্ভব সেখানে স্ট্যান্ডার্ড লাইব্রেরি ব্যবহারের জন্য আমার নিজের পছন্দ।
হোল্ডেনওয়েব

9
হয় eventlet.monkey_patch()প্রয়োজনীয়?
ব্যবহারকারী

3
হ্যাঁ, socketমডিউলটি বানরকে প্যাচ করা দরকার, তাই কমপক্ষে আপনার একটি দরকারeventlet.monkey_patch(socket=True)
আলভারো

52
2018 হিসাবে এই উত্তরটি পুরানো। ব্যবহারrequests.get('https://github.com', timeout=5)
CONvid19

313

সময়সীমা পরামিতি সেট করুন :

r = requests.get(w, verify=False, timeout=10) # 10 seconds

যতক্ষণ আপনি stream=Trueএই অনুরোধটি সেট না requests.get()করেন, সংযোগটি দশ সেকেন্ডের বেশি সময় নেয়, বা সার্ভার যদি দশ সেকেন্ডের বেশি ডেটা না প্রেরণ করে তবে কলটি সময়সীমা অতিক্রম করবে ।


31
এটি পুরো প্রতিক্রিয়ার জন্য নয়। requests.readthedocs.org/en/latest/user/quickstart/#timeouts
Kiarash

1
হ্যাঁ, এটি কিছু পরিস্থিতিতে। সেই পরিস্থিতিতে একটি আপনার হতে পারে। =) আমি আপনাকে কোডটি দেখার জন্য আমন্ত্রণ জানিয়েছি যদি আপনি বিশ্বাসী না হন।
লুকাশা

পরিস্থিতি কি?
কিয়ারাশ

1
আমি কেবল এটি পরীক্ষা করে দেখেছি এবং এটি কখনও থামেনি: r = অনুরোধ. get (' ipv4.download.thinkbroadband.com/1GB.zip ', সময়সীমা = 20)
কায়রাশ

5
আহ, দুঃখিত, আপনি যখন 'সম্পূর্ণ প্রতিক্রিয়া' বলেছিলেন তখন আমি কী বোঝাতে চেয়েছিলাম তা ভুল বুঝেছিলাম। হ্যাঁ, আপনি ঠিক বলেছেন: অপেক্ষা করতে মোট সময় এটি কোনও উচ্চতর সীমা নয়।
লুকাসা

85

আপডেট: https://requests.readthedocs.io/en/master/user/advanced/#timeouts

এর নতুন সংস্করণে requests:

আপনি যদি সময়সীমার জন্য একটি একক মান নির্দিষ্ট করে থাকেন তবে:

r = requests.get('https://github.com', timeout=5)

সময়সীমা মান উভয় connectএবং readসময়সীমা প্রয়োগ করা হবে । আপনি আলাদা আলাদাভাবে মান সেট করতে চাইলে একটি টিপল উল্লেখ করুন:

r = requests.get('https://github.com', timeout=(3.05, 27))

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

r = requests.get('https://github.com', timeout=None)

আমার পুরানো (সম্ভবত পুরানো) উত্তর (যা অনেক আগে পোস্ট করা হয়েছিল):

এই সমস্যাটি কাটিয়ে ওঠার অন্যান্য উপায় রয়েছে:

1. TimeoutSauceঅভ্যন্তরীণ ক্লাস ব্যবহার করুন

থেকে: https://github.com/kennethreitz/requests/issues/1928#issuecomment-35811896

import requests from requests.adapters import TimeoutSauce

class MyTimeout(TimeoutSauce):
    def __init__(self, *args, **kwargs):
        connect = kwargs.get('connect', 5)
        read = kwargs.get('read', connect)
        super(MyTimeout, self).__init__(connect=connect, read=read)

requests.adapters.TimeoutSauce = MyTimeout

এই কোডটি আমাদের সংযোগের সময়সীমার সমান হিসাবে পঠনের সময়সীমা সেট করার কারণ হতে পারে, যা আপনার সেশন.জেট () কলটিতে পাস করা সময়সীমা মান। (মনে রাখবেন যে আমি আসলে এই কোডটি পরীক্ষা করি নি, তাই এটির জন্য কিছু দ্রুত ডিবাগিংয়ের প্রয়োজন হতে পারে, আমি কেবল এটি সরাসরি গিটহাব উইন্ডোতে লিখেছি))

২. কেভিনবার্কের কাছ থেকে অনুরোধের কাঁটাচামচ ব্যবহার করুন: https://github.com/kevinburke/requests/tree/connect-timeout

এর ডকুমেন্টেশন থেকে: https://github.com/kevinburke/requests/blob/connect-timeout/docs/user/advanced.rst

আপনি যদি সময়সীমার জন্য একটি একক মান নির্দিষ্ট করে থাকেন তবে:

r = requests.get('https://github.com', timeout=5)

কালআউট মানটি সংযুক্ত এবং পঠিত টাইমআউট উভয় ক্ষেত্রেই প্রয়োগ করা হবে। আপনি আলাদা আলাদাভাবে মান সেট করতে চাইলে একটি টিপল উল্লেখ করুন:

r = requests.get('https://github.com', timeout=(3.05, 27))

কেভিনবার্ক এটিকে মূল অনুরোধ প্রকল্পে একীভূত করার জন্য অনুরোধ করেছেন, তবে এটি এখনও গৃহীত হয়নি।


বিকল্প 1 কাজ করে না। যদি আপনি এই থ্রেডটি পড়া চালিয়ে যান, অন্য লোকেরা বলেছে "এটি আপনার ব্যবহারের ক্ষেত্রে কাজ করে না, আমি ভয় করি The আমরা বাতিল হওয়া পাঠ্য সময়সীমার চেয়ে বেশি ডেটা প্রেরণ বন্ধ করে দেয়। "
কিয়ারাশ

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

@ কিরাশ আমি এখনও এটি পরীক্ষা করে দেখিনি। যাইহোক, আমি যেমন বুঝতে পারি যখন লুকাশা ড this won't work for you use-case। তার অর্থ এটি এমপি 3 স্ট্রিমের সাথে কাজ করে না যা অন্য লোকটি চেয়েছিল।
হিউ

1
@ হাইউ - এটি অন্য একটি অনুরোধের সাথে একীভূত করা হয়েছিল - github.com/kennethreitz/requests/pull/…
yprez

সময়সীমা = কেউই কলটিকে ব্লক করছে না।
পাগলদান

49

timeout = int(seconds)

থেকে requests >= 2.4.0 , আপনি timeoutযুক্তিটি ব্যবহার করতে পারেন , যেমন:

requests.get('https://duckduckgo.com/', timeout=10)

বিঃদ্রঃ:

timeoutসম্পূর্ণ প্রতিক্রিয়া ডাউনলোডের সময়সীমা নয়; পরিবর্তে, exceptionসার্ভার সময়সীমা সেকেন্ডের জন্য প্রতিক্রিয়া জারি না করা হলে একটি উত্থাপিত হয় (আরও স্পষ্টভাবে, টাইমআউট সেকেন্ডের জন্য অন্তর্নিহিত সকেটে কোনও বাইট না পাওয়া গেলে)। যদি কোনও টাইমআউট স্পষ্টভাবে নির্দিষ্ট না করা হয়, অনুরোধগুলির সময় শেষ হবে না।


নতুন টাইমআউট প্যারামিটারের অনুরোধের কোন সংস্করণ রয়েছে?
মরিচা

1
সংস্করণ ২.৪.০ থেকে মনে হচ্ছে: সংযোগের সময়সীমা জন্য সমর্থন! টাইমআউট এখন একটি টিউপল গ্রহণ করে (সংযুক্ত করুন, পড়ুন) যা পৃথক সংযোগ সেট করতে এবং টাইমআউটগুলি পড়ার জন্য ব্যবহৃত হয়pypi.org/project/requests/2.4.0
CONvid19

23

একটি সময়সীমা তৈরি করতে আপনি সংকেত ব্যবহার করতে পারেন

এই কেসটি সমাধানের সর্বোত্তম উপায় সম্ভবত এটি

  1. অ্যালার্ম সংকেতের জন্য হ্যান্ডলার হিসাবে একটি ব্যতিক্রম সেট করুন
  2. দশ সেকেন্ড বিলম্বের সাথে অ্যালার্ম সংকেত কল করুন
  3. ক এর ভিতরে ফাংশন কল করুন try-except-finallyব্লকের ।
  4. ফাংশনটির সময় শেষ হয়ে গেলে ব্যতীত ব্লকটি পৌঁছে যায়।
  5. শেষ অবধি আপনি অ্যালার্মটি বাতিল করে দেন, তাই এটি পরে গাওয়া হয় না।

এখানে কিছু উদাহরণ কোড দেওয়া হল:

import signal
from time import sleep

class TimeoutException(Exception):
    """ Simple Exception to be called on timeouts. """
    pass

def _timeout(signum, frame):
    """ Raise an TimeoutException.

    This is intended for use as a signal handler.
    The signum and frame arguments passed to this are ignored.

    """
    # Raise TimeoutException with system default timeout message
    raise TimeoutException()

# Set the handler for the SIGALRM signal:
signal.signal(signal.SIGALRM, _timeout)
# Send the SIGALRM signal in 10 seconds:
signal.alarm(10)

try:    
    # Do our code:
    print('This will take 11 seconds...')
    sleep(11)
    print('done!')
except TimeoutException:
    print('It timed out!')
finally:
    # Abort the sending of the SIGALRM signal:
    signal.alarm(0)

এর কিছু সতর্কতা রয়েছে:

  1. এটি থ্রেডসেফ নয়, সিগন্যাল সবসময় মূল থ্রেডে সরবরাহ করা হয়, তাই আপনি এটি অন্য কোনও থ্রেডে রাখতে পারবেন না।
  2. সিগন্যালের সময়সূচি এবং প্রকৃত কোড কার্যকর করার পরে কিছুটা বিলম্ব হয় is এর অর্থ হল যে এটি কেবল দশ সেকেন্ডের জন্য ঘুমিয়ে থাকলেও উদাহরণটি শেষ হয়ে যাবে।

তবে, এটি সব স্ট্যান্ডার্ড পাইথন লাইব্রেরিতে! স্লিপ ফাংশন আমদানি বাদে এটি কেবলমাত্র একটি আমদানি। আপনি যদি অনেক স্থানে সময়সীমা ব্যবহার করতে চলেছেন তবে সহজেই কোনও ফাংশনে টাইমআউট এক্সেপশন, _টাইমআউট এবং সিঙ্গেল রাখতে পারেন এবং কেবল এটি কল করতে পারেন। অথবা আপনি একটি সজ্জা তৈরি করতে এবং এটি ফাংশনগুলিতে রাখতে পারেন, নীচের লিঙ্কিত উত্তরটি দেখুন।

আপনি এটিকে "প্রসঙ্গ পরিচালক" হিসাবে সেট আপ করতে পারেন যাতে আপনি withবিবৃতি দিয়ে এটি ব্যবহার করতে পারেন :

import signal
class Timeout():
    """ Timeout for use with the `with` statement. """

    class TimeoutException(Exception):
        """ Simple Exception to be called on timeouts. """
        pass

    def _timeout(signum, frame):
        """ Raise an TimeoutException.

        This is intended for use as a signal handler.
        The signum and frame arguments passed to this are ignored.

        """
        raise Timeout.TimeoutException()

    def __init__(self, timeout=10):
        self.timeout = timeout
        signal.signal(signal.SIGALRM, Timeout._timeout)

    def __enter__(self):
        signal.alarm(self.timeout)

    def __exit__(self, exc_type, exc_value, traceback):
        signal.alarm(0)
        return exc_type is Timeout.TimeoutException

# Demonstration:
from time import sleep

print('This is going to take maximum 10 seconds...')
with Timeout(10):
    sleep(15)
    print('No timeout?')
print('Done')

এই প্রসঙ্গে ম্যানেজারের পদ্ধতির সাথে নীচের দিকের একটি সম্ভাব্য দিকটি হ'ল কোডটি আসলে সময় শেষ হয়েছে কিনা তা আপনি জানতে পারবেন না।

উত্স এবং প্রস্তাবিত পড়া:


3
সংকেত শুধুমাত্র মূল থ্রেড বিতরণ করা হয়, এভাবেই defnitely অন্যান্য থ্রেড কাজ করবে না, না সম্ভবত
দিমা তিসনেক

1
সময়সীমার-প্রসাধক প্যাকেজের মাধ্যমে একটি সময়সীমার প্রসাধক সংকেত (অথবা ঐচ্ছিকভাবে মাল্টিপ্রসেসিং) ব্যবহার করে প্রদান করে।
খ্রিস্টান লং

13

সময়সীমা এবং ত্রুটি পরিচালনার মাধ্যমে এই অনুরোধটি চেষ্টা করুন:

import requests
try: 
    url = "http://google.com"
    r = requests.get(url, timeout=10)
except requests.exceptions.Timeout as e: 
    print e

5

সেট stream=Trueএবং ব্যবহার করুন r.iter_content(1024)। হ্যাঁ, eventlet.Timeoutকোনওভাবে আমার পক্ষে কাজ করে না।

try:
    start = time()
    timeout = 5
    with get(config['source']['online'], stream=True, timeout=timeout) as r:
        r.raise_for_status()
        content = bytes()
        content_gen = r.iter_content(1024)
        while True:
            if time()-start > timeout:
                raise TimeoutError('Time out! ({} seconds)'.format(timeout))
            try:
                content += next(content_gen)
            except StopIteration:
                break
        data = content.decode().split('\n')
        if len(data) in [0, 1]:
            raise ValueError('Bad requests data')
except (exceptions.RequestException, ValueError, IndexError, KeyboardInterrupt,
        TimeoutError) as e:
    print(e)
    with open(config['source']['local']) as f:
        data = [line.strip() for line in f.readlines()]

আলোচনাটি এখানে https://redd.it/80kp1h


এটি লজ্জার অনুরোধ ম্যাক্সটাইম প্যারামগুলিকে সমর্থন করে না, এই সমাধানটি কেবলমাত্র অ্যাসিনসিওর সাথে কাজ করেছে
উইকং

4

এটি ওভারকিল হতে পারে তবে সিলারি বিতরণ করা টাস্কের সারিটির টাইমআউটগুলির জন্য ভাল সমর্থন রয়েছে।

বিশেষত, আপনি একটি নরম সময়সীমা নির্ধারণ করতে পারেন যা আপনার প্রক্রিয়াতে কেবলমাত্র একটি ব্যতিক্রম উত্থাপন করে (যাতে আপনি পরিষ্কার করতে পারেন) এবং / অথবা সময়সীমা অতিক্রম করার পরে একটি হার্ড সময় সীমা কাজ শেষ করে দেয়।

কভারগুলির অধীনে, এটি আপনার "আগে" পোস্টে উল্লিখিত একই সংকেত পদ্ধতির ব্যবহার করে তবে আরও ব্যবহারযোগ্য এবং পরিচালনাযোগ্য উপায়ে। এবং যদি আপনি নিরীক্ষণ করছেন এমন ওয়েবসাইটগুলির তালিকা যদি দীর্ঘ হয় তবে আপনি তার প্রাথমিক বৈশিষ্ট্যটি থেকে উপকৃত হতে পারেন - বিপুল সংখ্যক কার্য সম্পাদন পরিচালনা করার সমস্ত ধরণের উপায়।


এটি একটি ভাল সমাধান হতে পারে। মোট সময়সীমাটির সমস্যা সরাসরি সম্পর্কিত নয় python-requestsতবে এর সাথে httplib(পাইথন ২.7 এর অনুরোধে ব্যবহৃত)। প্যাকেজটি timeoutসরাসরি httplib এর সাথে সম্পর্কিত সমস্ত কিছু পাস করে । আমি মনে করি অনুরোধে কিছুই ঠিক করা যায় না কারণ এই প্রক্রিয়াটি httplib এ দীর্ঘ সময় ধরে থাকতে পারে।
hynekcer

@ হাইঙ্কার, আমি মনে করি আপনি ঠিক বলেছেন এই কারণেই প্রক্রিয়াজাতকরণের সময়সীমা নির্ধারণ এবং সিলারির মতো পরিষ্কারভাবে হত্যা প্রক্রিয়া প্রয়োগের মাধ্যমে প্রয়োগ করা ভাল পদ্ধতির হতে পারে।
ক্রিস জনসন

3

আমি বিশ্বাস করি আপনি multiprocessingকোনও তৃতীয় পক্ষের প্যাকেজ ব্যবহার করতে পারেন এবং নির্ভর করতে পারবেন না:

import multiprocessing
import requests

def call_with_timeout(func, args, kwargs, timeout):
    manager = multiprocessing.Manager()
    return_dict = manager.dict()

    # define a wrapper of `return_dict` to store the result.
    def function(return_dict):
        return_dict['value'] = func(*args, **kwargs)

    p = multiprocessing.Process(target=function, args=(return_dict,))
    p.start()

    # Force a max. `timeout` or wait for the process to finish
    p.join(timeout)

    # If thread is still active, it didn't finish: raise TimeoutError
    if p.is_alive():
        p.terminate()
        p.join()
        raise TimeoutError
    else:
        return return_dict['value']

call_with_timeout(requests.get, args=(url,), kwargs={'timeout': 10}, timeout=60)

পাস করা সময়সীমা kwargsহ'ল সার্ভারের কাছ থেকে কোনও প্রতিক্রিয়া পাওয়ার সময়সীমা , যুক্তিটি সম্পূর্ণ প্রতিক্রিয়া timeoutপাওয়ার সময়সীমা ।


সমস্ত ত্রুটি ধরা পড়ে এবং ফিরিয়ে_ডিক্ট ['ত্রুটি'] এ রাখে এমন ব্যক্তিগত ফাংশন ব্যতীত / জেনেরিক চেষ্টা করে এটিকে উন্নত করা যায়। তারপরে শেষে, ফিরে আসার আগে, 'ত্রুটি' রিটার্ন_ডিক্টে পরীক্ষা করুন এবং তারপরে এটি উত্থাপন করুন। এটি পাশাপাশি পরীক্ষা করা আরও সহজ করে তোলে।
ডায়ালটনে

2

সময়সীমা = (সংযোগের সময়সীমা, ডেটা পড়ার সময়সীমা) বা একক যুক্তি দিন (সময়সীমা = 1)

import requests

try:
    req = requests.request('GET', 'https://www.google.com',timeout=(1,1))
    print(req)
except requests.ReadTimeout:
    print("READ TIME OUT")

1

এই কোডটি সকেট এরর 11004 এবং 10060 এর জন্য কাজ করছে ......

# -*- encoding:UTF-8 -*-
__author__ = 'ACE'
import requests
from PyQt4.QtCore import *
from PyQt4.QtGui import *


class TimeOutModel(QThread):
    Existed = pyqtSignal(bool)
    TimeOut = pyqtSignal()

    def __init__(self, fun, timeout=500, parent=None):
        """
        @param fun: function or lambda
        @param timeout: ms
        """
        super(TimeOutModel, self).__init__(parent)
        self.fun = fun

        self.timeer = QTimer(self)
        self.timeer.setInterval(timeout)
        self.timeer.timeout.connect(self.time_timeout)
        self.Existed.connect(self.timeer.stop)
        self.timeer.start()

        self.setTerminationEnabled(True)

    def time_timeout(self):
        self.timeer.stop()
        self.TimeOut.emit()
        self.quit()
        self.terminate()

    def run(self):
        self.fun()


bb = lambda: requests.get("http://ipv4.download.thinkbroadband.com/1GB.zip")

a = QApplication([])

z = TimeOutModel(bb, 500)
print 'timeout'

a.exec_()

সৃজনশীলতার জন্য উত্সাহ প্রদান
জেএসমিথ

1

প্রশ্ন থেকে অনুরোধ সম্পর্কিত হওয়া সত্ত্বেও, আমি সঙ্গে কাজ করতে এই খুঁজে খুব সহজ pycurl CURLOPT_TIMEOUT বা CURLOPT_TIMEOUT_MS।

কোন থ্রেডিং বা সংকেত প্রয়োজন:

import pycurl
import StringIO

url = 'http://www.example.com/example.zip'
timeout_ms = 1000
raw = StringIO.StringIO()
c = pycurl.Curl()
c.setopt(pycurl.TIMEOUT_MS, timeout_ms)  # total timeout in milliseconds
c.setopt(pycurl.WRITEFUNCTION, raw.write)
c.setopt(pycurl.NOSIGNAL, 1)
c.setopt(pycurl.URL, url)
c.setopt(pycurl.HTTPGET, 1)
try:
    c.perform()
except pycurl.error:
    traceback.print_exc() # error generated on timeout
    pass # or just pass if you don't want to print the error

1

আপনি যদি বিকল্পটি ব্যবহার করেন তবে stream=Trueআপনি এটি করতে পারেন:

r = requests.get(
    'http://url_to_large_file',
    timeout=1,  # relevant only for underlying socket
    stream=True)

with open('/tmp/out_file.txt'), 'wb') as f:
    start_time = time.time()
    for chunk in r.iter_content(chunk_size=1024):
        if chunk:  # filter out keep-alive new chunks
            f.write(chunk)
        if time.time() - start_time > 8:
            raise Exception('Request took longer than 8s')

সমাধানের জন্য সিগন্যাল বা মাল্টিপ্রসেসিংয়ের প্রয়োজন হয় না।


1

আরও একটি সমাধান (এটি http://docs.python-requests.org/en/master/user/advanced/#streaming-uploads থেকে পেয়েছেন )

আপলোড করার আগে আপনি সামগ্রীর আকার জানতে পারবেন:

TOO_LONG = 10*1024*1024  # 10 Mb
big_url = "http://ipv4.download.thinkbroadband.com/1GB.zip"
r = requests.get(big_url, stream=True)
print (r.headers['content-length'])
# 1073741824  

if int(r.headers['content-length']) < TOO_LONG:
    # upload content:
    content = r.content

তবে সাবধান হন, একজন প্রেরক 'সামগ্রী-দৈর্ঘ্য' প্রতিক্রিয়া ক্ষেত্রে ভুল মান সেট করতে পারেন।


ধন্যবাদ। পরিষ্কার এবং সহজ সমাধান। আমার জন্য কাজ কর.
পেটিজুরিচ

0

যদি এটির আসে, একটি ওয়াচডগ থ্রেড তৈরি করুন যা 10 সেকেন্ডের পরে অনুরোধগুলির অভ্যন্তরীণ অবস্থাকে মেসেজ করে, যেমন:

  • অন্তর্নিহিত সকেট এবং আদর্শভাবে বন্ধ করে
  • অনুরোধগুলি অপারেশনটি পুনরায় চেষ্টা করে যদি একটি ব্যতিক্রম ট্রিগার করে

নোট করুন যে সিস্টেম লাইব্রেরির উপর নির্ভর করে আপনি DNS রেজোলিউশনে ডেডলাইন সেট করতে পারবেন না।


0

ঠিক আছে, আমি এই পৃষ্ঠায় অনেকগুলি সমাধান চেষ্টা করেছি এবং এখনও অস্থিতিশীলতা, এলোমেলোভাবে ঝুলানো, দুর্বল সংযোগ কর্মক্ষমতা faced

আমি এখন কার্ল ব্যবহার করছি এবং আমি এটির "সর্বাধিক সময়" কার্যকারিতা এবং বিশ্বব্যাপী পারফরম্যান্স সম্পর্কে এমনকি খুব খারাপ প্রয়োগের পরেও সত্যই খুশি:

content=commands.getoutput('curl -m6 -Ss "http://mywebsite.xyz"')

এখানে, আমি 6 সেকেন্ডের সর্বোচ্চ সময় পরামিতি সংজ্ঞায়িত করেছি, সংযোগ এবং স্থানান্তর সময় উভয়কেই নিযুক্ত করে।

আমি নিশ্চিত যে কার্লের অজগর বাঁধা রয়েছে, যদি আপনি পাইথোনিক সিনট্যাক্সটি আটকে থাকতে পছন্দ করেন :)


0

টাইমআউট-ডেকোরেটর নামে একটি প্যাকেজ রয়েছে যা আপনি যেকোন অজগর ফাংশনটি সময় সাপেক্ষে ব্যবহার করতে পারেন।

@timeout_decorator.timeout(5)
def mytest():
    print("Start")
    for i in range(1,10):
        time.sleep(1)
        print("{} seconds have passed".format(i))

এটি এখানে কিছু উত্তর প্রস্তাবিত সংকেত পদ্ধতির ব্যবহার করে। বিকল্পভাবে, আপনি এটি সিগন্যালের পরিবর্তে মাল্টিপ্রসেসিং ব্যবহার করতে বলতে পারেন (উদাহরণস্বরূপ যদি আপনি একটি বহু-থ্রেড পরিবেশে থাকেন)।


0

আমি অনুরোধগুলি ২.২.১ ব্যবহার করছি এবং ইভেন্টলেটটি আমার পক্ষে কাজ করে নি। পরিবর্তে আমি জেন্টেন্ট টাইমআউটটি ব্যবহার করতে সক্ষম হয়েছি কারণ আমার চাকরিতে বন্দুকের জন্য ব্যবহার করা হয় vent

import gevent
import gevent.monkey
gevent.monkey.patch_all(subprocess=True)
try:
    with gevent.Timeout(5):
        ret = requests.get(url)
        print ret.status_code, ret.content
except gevent.timeout.Timeout as e:
    print "timeout: {}".format(e.message)

অনুগ্রহ করে নোট করুন যে জেনভেন্ট.টাইমআউট.টাইমআউট সাধারণ ব্যতিক্রম হ্যান্ডলিংয়ের দ্বারা ধরা পড়ে না। সুতরাং হয় স্পষ্টভাবে ধরা gevent.timeout.Timeout বা যেমন ব্যবহার করতে একটি ভিন্ন ব্যতিক্রম পাস: with gevent.Timeout(5, requests.exceptions.Timeout):যদিও এই ব্যতিক্রম উত্থাপিত হয় যখন কোন বার্তা পাস করা হয়।


-1

আমি আরও একটি সরাসরি সমাধান নিয়ে এসেছি যা অবশ্যই কুৎসিত তবে আসল সমস্যাটি সমাধান করে। এটি কিছুটা এভাবে যায়:

resp = requests.get(some_url, stream=True)
resp.raw._fp.fp._sock.settimeout(read_timeout)
# This will load the entire response even though stream is set
content = resp.content

আপনি এখানে সম্পূর্ণ ব্যাখ্যা পড়তে পারেন


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.