使用 asyncio 进行超时和计数控制

Timeout and count control with asyncio

我只是尝试使用异步脚本来使用 asyncio 进行解析。我找到了类似的问题,并将 答案作为我的任务模式。我为请求添加了延迟(链接答案的第一部分),还尝试添加活动请求的计数器(第二部分)。但是此代码仅启动 5 个请求,然后等待。
我找不到很好的解释 asyncio.Event 是如何工作的,所以我想请你帮助我改进我的代码。提前谢谢你。

import json
from bs4 import BeautifulSoup
import asyncio 
import aiohttp 

active_calls = 0
MAX_CALLS = 5

def write_to_txt_file(text, name):    
    f = open(f'{PATH}{name}.txt', 'w')
    f.write(text)
    f.close()

async def getData(item , session, next_delay , event):
    global active_calls, next_delay

    await event.wait()

    if active_calls > MAX_CALLS - 1:
        event.clear()
        next_delay = 0.1

    print( 'start' , active_calls)

    active_calls += 1
    next_delay += DELAY
    await asyncio.sleep(next_delay)
    try:

        async with session.get(url=item['Link'] ) as response:
    
            soup = BeautifulSoup(await response.text(), 'html.parser')
            name = str(item["ID"]) + '. ' + item["Title"][:100]
            text = soup.find(id="begin").get_text()
            write_to_txt_file(text , name)


    finally:
        active_calls -= 1
    if active_calls == 0:
        event.set()


async def parseFromJson(): 
     with open('./data2/csvjson.json') as data_file:         #take links from JSON
        data = json.load(data_file)
        async with aiohttp.ClientSession() as session: 
            tasks = [] 

            event = asyncio.Event()
            event.set()

            next_delay = 0.1
            DELAY = 0.3
            for item in data:
            
                task = asyncio.create_task(getData(item , session, next_delay , event))
                next_delay += DELAY
                tasks.append(task) 
            await asyncio.gather(*tasks)

def main():
    asyncio.run(parseFromJson())
    

if __name__ == "__main__":
    main()

UPD:我想这段代码只能停止请求但不能再次启动它?

UPD:我更改了我的代码,现在它是这样工作的:

  1. 一次启动所有 getData() 函数
  2. 脚本启动 5 个请求并在 'await event.wait()' 行停止 其余
  3. 所有请求完成,我开始'event.set()'
  4. 此后所有功能连续作息要求 已开始(不限制 5 个请求)。

如何解决?

所以我只是添加了循环,所有函数每次都检查等待,这似乎不正确但它帮助了我

while active_calls > MAX_CALLS:
        print(1)
        await event.wait()