【问题标题】:Results of asyncio are not as expectedasyncio 的结果不如预期
【发布时间】:2018-03-18 01:33:46
【问题描述】:

我正在学习asyncio 库来完成一些我想要完成的任务。我编写了以下代码来教自己如何在执行原始任务时切换到另一个任务。正如您在下面看到的,应该执行summation(),直到满足它应该跳转到secondaryTask() 的条件。在secondaryTask() 完成后,它应该返回到summation(),希望它在那里完成。潜在结果应该是sum=1225mul=24

import asyncio, time


async def summation():
    print('Running summation from 0 to 50:')
    sum = 0
    for i in range(25):
        sum = sum + i
        if i != 25:
            time.sleep(0.1)
        else:
            await asyncio.sleep(0) # pretend to be non-blocking work (Jump to the next task)
    print('This message is shown because summation() is completed! sum= %d' % sum)


async def secondaryTask():
    print('Do some secondaryTask here while summation() is on progress')
    mul = 1
    for i in range(1, 5):
        mul = mul * i
        time.sleep(0.1)
    await asyncio.sleep(0)
    print('This message is shown because secondaryTask() is completed! Mul= %d' % mul)

t0 = time.time()
ioloop = asyncio.get_event_loop()
tasks = [ioloop.create_task(summation()), ioloop.create_task(secondaryTask())]
wait_tasks = asyncio.wait(tasks)
ioloop.run_until_complete(wait_tasks)
ioloop.close()
t1 = time.time()
print('Total time= %.3f' % (t1-t0))

此代码未按预期执行,因为 sum=300sum=1225 相反。显然,summation() 在处理 secondaryTask() 时不会继续。如何修改summation() 才能在后台对剩余的 25 个值求和?

谢谢

【问题讨论】:

  • Python 范围是排他的,所以i != 25 将始终评估为真;你可能打算写i != 24,或者只是把最后的await放在循环之后。即使已修复,也不清楚您认为最终的 asyncio.sleep(0) 会完成什么。由于 summation 有 25 次迭代,每次耗时 0.1 秒,而secondaryTask 只有 4 次迭代,每次耗时 0.1 秒,secondaryTask 将在 summation() 结束时完成。另外,为什么你认为其他任务会影响summation 打印的总和,因为它们没有共享状态?

标签: python python-3.x asynchronous python-asyncio


【解决方案1】:

这只是你的粗心。你想运行summation从0到50,你的summation函数应该是for i in range(50)

【讨论】:

  • 哦,对不起!我没有注意到这一点。看不到这个小错误我有点累了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
相关资源
最近更新 更多