به هر پروکسی aiohttp بودجه همزمانی خودش را بدهید
کار در جریان را برای هر پروکسی انتخابشده محدود کنید و در عین حال محدودیتهای استخر اتصال aiohttp و پاکسازی پاسخ را حفظ کنید.
یک استخر پروکسی میتواند نقاط پایانی با ظرفیتهای بسیار متفاوت داشته باشد. اجازه دادن به پنجاه عملیات در برنامه مانع از آن نمیشود که چهل و نه مورد از آنها همان پروکسی را انتخاب کنند.
اگر سیاست «حداکثر چهار عملیات در جریان از طریق هر پروکسی انتخابشده» است، آن سیاست را مستقیم بیان کنید. برای هر هویت پروکسی یک سمافور نگه دارید و آن را حول کاری که ظرفیت پروکسی را مصرف میکند به دست آورید.
limits = {proxy: asyncio.Semaphore(4) for proxy in proxy_urls}
async def fetch(session, proxy, url):
async with limits[proxy]:
async with session.get(url, proxy=proxy) as response:
return await response.read()این طرح فرض میکند که asyncio وارد شده و URLهای پروکسی اعتبارسنجی شدهاند. برای درخواستهای عمومی روی مسیر پروکسی عمومی مجاز، فهرست پروکسی HTTP نامزدهایی برای URLهای پروکسی aiohttp فراهم میکند. یک برنامه واقعی باید مهلت درخواست خودش را نیز تنظیم کند و تصمیم بگیرد چه مقدار داده پاسخ لازم دارد. خواندن کامل یک فایل بزرگ در حافظه تصمیمی جداگانه درباره منابع است.
مجوز را برای بخش گران نگه دارید
آزاد کردن سمافور بهمحض رسیدن سرآیندهای پاسخ میتواند محدودیت موردنظر را بیاثر کند. بدنه جریانی ممکن است مدتها بعد همچنان از اتصال استفاده کند. مجوز را نگه دارید تا بدنه مصرف شود یا پاسخ طبق جریان کاری برنامه بسته شود.
مدیرهای زمینه تودرتو پاکسازی را زمانی که یک استثنا یا لغو عملیات را ترک میکند قابل مشاهده میکنند. از بهدستگرفتن دستی و آزادسازی فقط در انتهای یک تابع موفق پرهیز کنید.
محدودیتهای اتصال به پرسش دیگری پاسخ میدهند
محدودیتهای اتصالدهنده aiohttp اتصالها را طبق قواعد مستند اتصالدهنده محدود میکنند. آنها در کنار سمافور برنامه مفید میمانند. محدودیت اتصال بهازای هر مقصد، تنها با نامش، بودجهای را که همه مقصدهای تخصیصیافته به یک پروکسی به اشتراک میگذارند بیان نمیکند.
همچنین همزمانی را از نرخ درخواست جدا کنید. چهار درخواست طولانی و چهار درخواست بسیار کوتاه از همان سهمیه همزمانی استفاده میکنند اما نرخ درخواست بر ثانیه متفاوتی تولید میکنند. سرویسی با سیاست نرخ ممکن است به تنظیم آهنگ یا محدودکننده نرخ جداگانه نیاز داشته باشد.
یک شناسه پروکسی پایدار و غیرمحرمانه برای گزارشها و سنجهها انتخاب کنید. اگر دو URL دارای اعتبارنامه به همان استخر ظرفیت اشاره میکنند، تصمیم بگیرید آیا باید یک بودجه را به اشتراک بگذارند. در مقابل، پورتها یا حسابهای مختلف میتوانند محدودیتهای جداگانهای را نشان دهند وقتی اپراتور آنها را اینگونه مستند میکند.
وقتی توان عملیاتی کاهش مییابد، بررسی کنید کار کجا منتظر است: سمافور شما، اتصالدهنده، برقراری اتصال پروکسی یا خواندن پاسخها. بالا بردن همه محدودیتها همزمان آن تمایز را دشوارتر میکند و میتواند صف را به پروکسیای منتقل کند که آن را کنترل نمیکنید.