python asyncio - 从文档中添加信号量到示例

时间:2017-08-28 14:19:32

标签: python

我正在尝试重复使用以下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

0 个答案:

没有答案