gpt4 book ai didi

异步等待函数中的 Python asyncio.semaphore

转载 作者:太空狗 更新时间:2023-10-30 00:34:39 25 4
gpt4 key购买 nike

我正在尝试自学 Python 的异步功能。为此,我构建了一个异步网络抓取工具。我想限制我一次打开的连接总数,以成为服务器上的好公民。我知道信号量是一个很好的解决方案,asyncio 库有一个 semaphore内置类。我的问题是,当您在 async 函数中使用 yield from 时,Python 会提示,因为您正在组合 yieldawait语法。下面是我使用的确切语法...

import asyncio
import aiohttp

sema = asyncio.BoundedSemaphore(5)

async def get_page_text(url):
with (yield from sema):
try:
resp = await aiohttp.request('GET', url)
if resp.status == 200:
ret_val = await resp.text()
except:
raise ValueError
finally:
await resp.release()
return ret_val

引发此异常:

File "<ipython-input-3-9b9bdb963407>", line 14
with (yield from sema):
^
SyntaxError: 'yield from' inside async function

我能想到的一些可能的解决方案...

  1. 只需使用 @asyncio.coroutine 装饰器
  2. 使用threading.Semaphore?这似乎可能会导致其他问题
  3. this 的 Python 3.6 测试版中试试这个原因。

我对 Python 的异步功能还很陌生,所以我可能会遗漏一些明显的东西。

最佳答案

您可以使用async with 语句来获取异步上下文管理器:

#!/usr/local/bin/python3.5
import asyncio
from aiohttp import ClientSession


sema = asyncio.BoundedSemaphore(5)

async def hello(url):
async with ClientSession() as session:
async with sema, session.get(url) as response:
response = await response.read()
print(response)

loop = asyncio.get_event_loop()
loop.run_until_complete(hello("http://httpbin.org/headers"))

示例取自 here .该页面也是一般 asyncioaiohttp 的良好入门。

关于异步等待函数中的 Python asyncio.semaphore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40836800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com