请老师看下捡豆子异步代码哪里有问题,函数值运行一次

请老师看下捡豆子异步代码哪里有问题,函数值运行一次

import random
import asyncio

"""
    async 定义异步函数
    await 执行异步
    gather 将异步函数批量执行
    run 执行主异步函数
"""

# 豆子总数
beans = list(range(1, 51))

async def child_a():
    a_beans = []
    bean_num = len(beans)
    while bean_num > 0:
        a_gather_bean = random.choice(beans)
        a_beans.append(a_gather_bean)
        beans.remove(a_gather_bean)
        bean_num -= 1
        await asyncio.sleep(random.random())
        return 'child_a捡了%s个豆子,还剩%s个'%(len(a_beans), bean_num)

async def child_b():
    b_beans = []
    bean_num = len(beans)
    while bean_num > 0:
        b_gather_bean = random.choice(beans)
        b_beans.append(b_gather_bean)
        beans.remove(b_gather_bean)
        bean_num -= 1
        await asyncio.sleep(random.random())
        return 'child_b捡了%s个豆子,还剩%s个'%(len(b_beans), bean_num)

async def main():
    result = await asyncio.gather(child_a(), child_b())
    return result
    
    
if __name__ == '__main__':
    result = asyncio.run(main())
    print("a_beans:", result[0])
    print("b_beans:", result[1])
    

运行结果如下,只执行了一次,请问怎么改进?
图片描述

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好!

1、在函数中遇到return会返回并结束函数,以上代码中需要将return写在最后

https://img1.sycdn.imooc.com//climg/6350ada5097a424b10940643.jpg

2、bean_num应为全局变量,child_a()和child_a()都应对同一个bean_num进行修改

https://img1.sycdn.imooc.com//climg/6350adc109bdf5d710690648.jpg

参考代码:

import random
import asyncio

"""
    async 定义异步函数
    await 执行异步
    gather 将异步函数批量执行
    run 执行主异步函数
"""

# 豆子总数
beans = list(range(1, 51))
bean_num = len(beans)

async def child_a():
    a_beans = []
    global bean_num
    while bean_num > 0:
        a_gather_bean = random.choice(beans)
        a_beans.append(a_gather_bean)
        beans.remove(a_gather_bean)
        bean_num -= 1
        print('child_a捡了%s个豆子,还剩%s个' % (len(a_beans), bean_num))
        await asyncio.sleep(random.random())
        # return 'child_b捡了%s个豆子,还剩%s个' % (len(b_beans), bean_num)
    return 'child_a捡了%s个豆子,还剩%s个' % (len(a_beans), bean_num)


async def child_b():
    b_beans = []
    global bean_num
    while bean_num > 0:
        b_gather_bean = random.choice(beans)
        b_beans.append(b_gather_bean)
        beans.remove(b_gather_bean)
        bean_num -= 1
        await asyncio.sleep(random.random())
        print('child_b捡了%s个豆子,还剩%s个' % (len(b_beans), bean_num))
    return 'child_b捡了%s个豆子,还剩%s个' % (len(b_beans), bean_num)


async def main():
    result = await asyncio.gather(child_a(), child_b())
    return result

if __name__ == '__main__':
    result = asyncio.run(main())
    print("a_beans:", result[0])
    print("b_beans:", result[1])

祝学习愉快~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师