برای ارسال درخواست‌ Asynchronous با requests در پایتون با استفاده از کتاب‌خانه‌های requests و asyncio، شما به کتاب‌خانه aiohttp نیز نیاز دارید. در اینجا یک مثال ساده از برخی از مراحل لازم برای انجام این کار آورده شده است.

مراحل ارسال درخواست‌های هم‌زمان

  1. نصب کتاب‌خانه‌ها ابتدا اطمینان حاصل کنید که کتاب‌خانه‌های aiohttp و requests نصب شده‌اند. اگر نصب نکرده‌اید، می‌توانید با استفاده از pip آن‌ها را نصب کنید:
    pip install aiohttp requests
    
  2. استفاده از aiohttp برای ارسال درخواست‌های غیرهم‌زمان در اینجا یک مثال ساده برای دریافت داده‌ها از چندین URL هم‌زمان با استفاده از asyncio و aiohttp آورده شده است.
    import asyncio
    import aiohttp
    
    async def fetch(url):
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:
                return await response.text()
    
    async def main(urls):
        tasks = []
        for url in urls:
            tasks.append(fetch(url))
        return await asyncio.gather(*tasks)
    
    if __name__ == "__main__":
        urls = [
            "https://api.github.com",
            "https://www.example.com",
            "https://httpbin.org/get"
        ]
        results = asyncio.run(main(urls))
        for result in results:
            print(result)
    

توضیح کد

  • fetch(url): این تابع به عنوان یک تابع هم‌زمان (asynchronous function) تعریف شده است که یک URL را دریافت می‌کند و محتوای آن را با استفاده از aiohttp می‌خواند.
  • main(urls): این تابع لیستی از URLها را گرفته و با استفاده از asyncio.gather() درخواست‌ها را به صورت هم‌زمان ارسال می‌کند.
  • asyncio.run(): در نهایت، این تابع main را اجرا می‌کند و نتایج درخواست‌ها را دریافت و نمایش می‌دهد.

آموزش کتابخانه ریکوئست

استفاده از requests در حالت هم‌زمان

کتاب‌خانه requests به طور پیش‌فرض هم‌زمان نیست، اما می‌توانید از آن در عین حال با concurrent.futures.ThreadPoolExecutor استفاده کنید. این روش برای درخواست‌های هم‌زمان، مثلاً برای انجام کارهای I/O می‌تواند مناسب باشد.

import requests
from concurrent.futures import ThreadPoolExecutor

def fetch(url):
    response = requests.get(url)
    return response.text

if __name__ == "__main__":
    urls = [
        "https://api.github.com",
        "https://www.example.com",
        "https://httpbin.org/get"
    ]
    
    with ThreadPoolExecutor() as executor:
        results = list(executor.map(fetch, urls))
        
    for result in results:
        print(result)

نکات پایانی

  • استفاده از aiohttp و asyncio برای درخواست‌های هم‌زمان معمولاً به مراتب کارآمدتر از استفاده از requests به همراه ThreadPoolExecutor است، به ویژه برای تعداد زیادی از درخواست‌ها.
  • با در نظر داشتن نیازهای پروژه خود، می‌توانید از هر یک از این روش‌ها استفاده کنید.

با استفاده از این روش‌ها، می‌توانید به راحتی ارسال درخواست‌ Asynchronous با requests را با پایتون انجام دهید! اگر سوال یا نکته خاصی دارید، خوشحال می‌شوم که کمک کنم.

کانال یوتیوب کدیتی