我正在尝试重复使用以下Internal properties答案中显示的代码:
特别是信号量部分:
async with sema, session.get(url) as response:
response = await response.read()
我无法将其重新用于不涉及aiohttp的代码。
有没有人能告诉我如何在下面的例子中使用信号量:(例如,sema = asyncio.Semaphore(2)
只允许2个同时计算阶乘)?
import asyncio
async def factorial(name, number):
f = 1
for i in range(2, number+1):
print("Task %s: Compute factorial(%s)..." % (name, i))
await asyncio.sleep(1)
f *= i
print("Task %s: factorial(%s) = %s" % (name, number, f))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(
factorial("A", 2),
factorial("B", 3),
factorial("C", 4),
))
loop.close()
我试过
import asyncio
sema = asyncio.Semaphore(2)
async def factorial(name, number):
async with sema:
f = 1
for i in range(2, number+1):
print("Task %s: Compute factorial(%s)..." % (name, i))
await asyncio.sleep(1)
f *= i
print("Task %s: factorial(%s) = %s" % (name, number, f))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(
factorial("A", 2),
factorial("B", 3),
factorial("C", 4),
))
loop.close()
我也尝试了下面发布的解决方案作为评论。两者都返回RuntimeError: Event loop is closed