当等待asyncio.sleep(0.01)是不够的

时间:2019-04-21 12:41:22

标签: python-3.x python-asyncio

我有这个程序

import time
import asyncio


def is_prime(x):

    return not any(x//i == x/i for i in range(x-1, 1, -1))


async def highest_prime_below(x):

    print('Highest prime below %d' % x)
    for y in range(x-1, 0, -1):
        if is_prime(y):
            print('→ Highest prime below %d is %d' % (x, y))
            return y
        await asyncio.sleep(0.01)
    return None


async def main():

    t0 = time.time()
    await asyncio.wait( [
        highest_prime_below(100000),
        highest_prime_below(10000),
        highest_prime_below(1000)
        ] )
    t1 = time.time()
    print('Took %.2f ms' % (1000*(t1-t0)))


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
#loop.close()
发现素数的

。您也可以在这里https://osf.io/w8u26/

看到它

我的问题是,可以说我有太多的函数调用

await asyncio.wait( [
        highest_prime_below(100000),
        highest_prime_below(10000),
        highest_prime_below(1000)
        #100 function calls here
        ] )

而且我只有异步睡眠这么多await asyncio.sleep(0.01)

所有功能都必须在设定的时间内完成,还是在睡眠时间过后某些功能会被撤消?。

2 个答案:

答案 0 :(得分:1)

  

所有功能都必须在设定的时间内完成,还是在睡眠时间过后某些功能会被撤消?。

您的睡眠时间无关紧要; await asyncio.sleep()在这里的唯一作用是强制asyncio暂停事件循环的执行,并给其他任务一个运行的机会。您可能还会等待asyncio.sleep(0),然后achieve the same effect

换句话说:不,函数的运行时间与休眠中指定的时间没有任何关系。只要您使用asyncio.wait()等待所有协程,它们就会在wait()返回时全部完成。增加睡眠时间只会使它们运行更长的时间。

答案 1 :(得分:0)

此脚本的CPU绑定比io绑定更多。您是否考虑过通过线程实现并发?如果必须调用数百个这些函数,则将看到巨大的改进。