使用 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:我更改了我的代码,现在它是这样工作的:
- 一次启动所有 getData() 函数
- 脚本启动 5 个请求并在 'await event.wait()' 行停止
其余
- 所有请求完成,我开始'event.set()'
- 此后所有功能连续作息要求
已开始(不限制 5 个请求)。
如何解决?
所以我只是添加了循环,所有函数每次都检查等待,这似乎不正确但它帮助了我
while active_calls > MAX_CALLS:
print(1)
await event.wait()
我只是尝试使用异步脚本来使用 asyncio 进行解析。我找到了类似的问题,并将
我找不到很好的解释 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:我更改了我的代码,现在它是这样工作的:
- 一次启动所有 getData() 函数
- 脚本启动 5 个请求并在 'await event.wait()' 行停止 其余
- 所有请求完成,我开始'event.set()'
- 此后所有功能连续作息要求 已开始(不限制 5 个请求)。
如何解决?
所以我只是添加了循环,所有函数每次都检查等待,这似乎不正确但它帮助了我
while active_calls > MAX_CALLS:
print(1)
await event.wait()