Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 使用异步IO任务的无限循环在回调中获取aiohttp请求响应_Python 3.x_Concurrency_Python Requests_Python Asyncio_Aiohttp - Fatal编程技术网

Python 3.x 使用异步IO任务的无限循环在回调中获取aiohttp请求响应

Python 3.x 使用异步IO任务的无限循环在回调中获取aiohttp请求响应,python-3.x,concurrency,python-requests,python-asyncio,aiohttp,Python 3.x,Concurrency,Python Requests,Python Asyncio,Aiohttp,我在做什么-我试图使用asyncio和aiohttp在一个无限循环中发出多个post请求(对具有不同参数的同一URL) def callback(response): print(response) async def make_request(session, payload, sema): async with sema, session.post(url=URL, headers=HEADERS, data=json.dumps(payload)) \

我在做什么-我试图使用asyncio和aiohttp在一个无限循环中发出多个post请求(对具有不同参数的同一URL)

def callback(response):
    print(response) 

async def make_request(session, payload, sema):
        async with sema, session.post(url=URL, headers=HEADERS, data=json.dumps(payload)) \
                as response:
            return await response.json()


async def generate_requests(payloads):
    tasks = []
    sema = asyncio.BoundedSemaphore(value=100)
    async with aiohttp.ClientSession() as session:
        for payload in payloads:
            tasks.append(make_request(session, payload, sema))
        results = await asyncio.gather(*tasks, return_exceptions=True)
        print(results)


def run_asyncio_requests():
    loop = asyncio.get_event_loop()
    while True:
        for country in countries:
            cities = country.cities
            loop.run_until_complete(generate_requests(cities))


if __name__ == '__main__':
    run_asyncio_requests()
问题:运行\u asyncio\u请求函数生成并发出多个请求(城市对国家),然后等待一个国家请求的所有响应,然后执行下一个国家请求


我想要的:所有国家/地区的请求都应该立即执行,回调(与每个请求相关联的某种函数)函数应该处理每个响应,因为每个请求的请求后响应时间不同。它不应该等到收集所有的回应。请求应该在每个循环(无限循环)中生成,后台的回调函数应该与每个响应链接。我知道我正在使用asyncio.gather获取所有响应,直到请求完成。但是我不知道怎么做。

您可以在调用
生成请求时应用与调用
生成请求时相同的技术:

async def generate_all_countries():
任务=[为国家/地区中的国家/地区生成_请求(country.cities)]
结果=等待asyncio.gather(*任务)
打印(结果)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
asyncio.run(生成所有国家/地区()

请注意,您不需要将
run\u asyncio\u请求
作为一个单独的同步函数,只需使用
asyncio.run()
调用一个异步函数就可以了。

感谢您的回复。对您建议的代码将生成所有请求响应时收集响应的回调函数如何。@Ahsanaslam您不能只修改
发出请求
和/或
生成请求
来调用您需要的回调函数吗?我不知道在哪里放置回调函数,还有一件事是一个循环(无限循环)所有国家/地区都请求生成并等待所有响应,但我需要继续不断生成的无限循环,回调函数处理每个响应而不附加其他响应。我不知道在哪里放置回调函数-您可以在
make_request
的末尾或在
生成_请求
,具体取决于您希望回调遵守的内容。或者我误解了您想要实现的目标?上述代码运行良好,但问题是在无限循环周期中,我的代码等待每个周期(对于国家/地区:)生成的请求,当一个周期的所有响应完成时,它会生成下一个周期的请求。我想要一种机制,在这种机制中,代码不应该等待每个周期响应。当来自post请求的响应时,回调函数应自动触发。