PoolTimeout भनेको HTTPX ले तोकिएको प्रतीक्षा समयमा पुलबाट जडान पाएन भन्ने हो। यो प्रोक्सीतर्फ नयाँ TCP जडानको टाइमआउट भएको प्रमाण होइन। दोस्रो अनुरोध अझै प्रक्रियाभित्र पर्खिरहेको हुन सक्छ।

क्लाइन्टले एउटा जडान मात्र अनुमति दिन्छ र पहिलो स्ट्रिमिङ प्रतिक्रिया खुला छोडिन्छ भने यो सजिलै दोहोरिन्छ। अर्को अनुरोध सुरु गर्दा त्यो जडान आफैँ खाली हुँदैन।

स्ट्रिमिङ प्रतिक्रियाको जिम्मेवारी स्पष्ट राख्नुहोस्

import httpx

limits = httpx.Limits(
    max_connections=1,
    max_keepalive_connections=1,
)
timeout = httpx.Timeout(
    connect=5, read=10, write=10, pool=1
)

with httpx.Client(
    proxy="http://203.0.113.10:8080",
    trust_env=False,
    limits=limits,
    timeout=timeout,
) as client:
    with client.stream("GET", "https://example.com/") as response:
        print(response.status_code)
        for chunk in response.iter_bytes():
            print(len(chunk))

    next_response = client.get("https://example.com/")
    print(next_response.status_code)

चलाउनुअघि कागजातको प्रोक्सी ठेगाना बदल्नुहोस्। अर्को अनुरोध स्ट्रिम कन्टेक्स्टबाट बाहिरिएपछि सुरु हुन्छ। कोड लुपबाट निस्के वा अपवाद आए पनि बाहिरिनुले प्रतिक्रिया बन्द गर्छ।

client.send(request, stream=True) जस्तो म्यानुअल स्ट्रिमिङमा अन्तिम बन्द गर्ने जिम्मा तपाईंको कोडको हो। AsyncClientमा सम्बन्धित म्यानुअल सफाइका लागि response.aclose()लाई await गरिन्छ। नपढिएको प्रतिक्रिया बन्द गर्दा क्षमता खाली हुन्छ तर आधारभूत जडान पुनःप्रयोग गर्नुको सट्टा त्याग्नुपर्ने हुन सक्छ।

अपवादको नाम पढ्नुहोस्

ConnectTimeout जडान स्थापना गर्नुसँग सम्बन्धित छ। ReadTimeout प्रतिक्रिया डेटा पर्खनुसँग। PoolTimeout जडानको ठाउँ पाउनुसँग। «प्रोक्सी टाइमआउट» मात्र लेख्दा सही समाधान छान्न चाहिने फरक हराउँछ।

एन्डपोइन्ट IP बदल्नुअघि खुला प्रतिक्रिया, समवर्ती काम र जडान सीमा हेर्नुहोस्। उचित समवर्ती भारका लागि ठूलो पुल उपयुक्त हुन सक्छ, तर कहिल्यै बन्द नहुने प्रतिक्रिया ठीक गर्दैन। यसले एपलाई ओगट्न थप क्षमता मात्र दिन्छ।

पूरै काममा क्लाइन्ट पुनःप्रयोगयोग्य राख्नुहोस्। हरेक अनुरोध चलेको देखाउन क्लाइन्ट फेरि बनाउँदा जीवनचक्र समस्या लुक्न सक्छ र जडानको पुनःप्रयोग हराउन सक्छ।

सम्बन्धित लेखहरू