HTTPX PoolTimeout پراکسی سے کنکشن کی مہلت ختم ہونا نہیں
HTTPX کنکشن پول کی انتظار پہچانیں اور اس پراکسی کو بدلنے سے پہلے اسٹریمنگ جواب آزاد کریں جسے شاید اگلی درخواست ملی ہی نہ ہو۔
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)
چلانے سے پہلے دستاویزی پراکسی پتہ بدلیں۔ اگلی درخواست stream context سے نکلنے کے بعد شروع ہوتی ہے۔ یہ اخراج جواب بند کرتا ہے، چاہے کوڈ لوپ سے باہر نکلے یا exception دے۔
دستی اسٹریمنگ، جیسے client.send(request, stream=True)، میں آخری بندش آپ کے کوڈ کی ذمہ داری ہے۔ AsyncClient کے لیے متعلقہ دستی صفائی کا response.aclose() سے انتظار کیا جاتا ہے۔ بغیر پڑھے جواب کو بند کرنا گنجائش آزاد کرتا ہے مگر بنیادی کنکشن دوبارہ استعمال کرنے کے بجائے ترک کرنا پڑ سکتا ہے۔
exception کا نام پڑھیں
ConnectTimeout کنکشن قائم کرنے کے متعلق ہے۔ ReadTimeout جواب کے ڈیٹا کے انتظار کے متعلق۔ PoolTimeout کنکشن کی جگہ ملنے کے متعلق۔ صرف «پراکسی ٹائم آؤٹ» لکھنا درست حل چننے کے لیے ضروری فرق کھو دیتا ہے۔
اینڈپوائنٹ کے IP بدلنے سے پہلے کھلے جواب، ہم وقت کام اور کنکشن کی حدیں دیکھیں۔ بڑا پول جائز ہم وقت بوجھ کے لیے مناسب ہو سکتا ہے مگر کبھی بند نہ ہونے والے جواب درست نہیں کرتا۔ یہ صرف ایپ کو بھرنے کے لیے زیادہ گنجائش دیتا ہے۔
پورے کام کے بوجھ میں کلائنٹ دوبارہ استعمال کے قابل رکھیں۔ ہر درخواست بظاہر چلانے کے لیے کلائنٹ دوبارہ بنانا لائف سائیکل کا مسئلہ چھپا سکتا ہے اور کنکشن کے دوبارہ استعمال کو ضائع کر سکتا ہے۔