作业问题

作业问题

# coding:utf-8
import threading


class CandyDivide(object):
    def __init__(self, candy_list, kids_get):
        self.candy_list = candy_list
        self.kids_get = kids_get

    def candy_divide(self, kid):
        while len(self.candy_list) > 0:
            if len(self.kids_get[kid]) < 20:
                candy = self.candy_list.pop()
                self.kids_get[kid].append(candy)
            else:
                break


if __name__ == '__main__':
    candy_list = ['candy%s' % i for i in range(1, 101)]
    kids_get = {1: [], 2: [], 3: [], 4: [], 5: []}
    solution = CandyDivide(candy_list, kids_get)
    for i in range(1, 6):
        t = threading.Thread(target=solution.candy_divide, args=(i,))
        t.start()
    for key, value in solution.kids_get.items():
        print(f'{key}号小孩得到的糖果为{value}')

相关截图:

https://img1.sycdn.imooc.com//climg/62d0063f095a07c511480210.jpg

问题描述:

每个小朋友得到的糖果不是随机的,这和单线程就没有区别了啊,还是多线程吗

正在回答 回答被采纳积分+1

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

1回答
好帮手慕小猿 2022-07-15 10:02:49

同学,你好!同学这个也是多线程的,同学是创建了5个线程,即:5个小朋友。若想随机分糖果,同学可做如下操作。
https://img1.sycdn.imooc.com//climg/62d0cab70925057815680662.jpg
祝学习愉快~

  • 提问者 慕先生1375090 #1

    从运行结果来看,这五个线程是按顺序执行的不是吗

    2022-07-15 15:50:02
  • 好帮手慕小猿 回复 提问者 慕先生1375090 #2

    同学,你好!按顺序输出是因为代码中子线程执行代码完成的速度恰巧比主线程https://img1.sycdn.imooc.com//climg/62d132db091f70b605460069.jpg
    执行速度快,小朋友分的糖果已经加入到各自的列表中了。同学可以在candy_divide()方法中输出下当前小朋友的糖数和获得糖的列表看一下,小朋友分糖不是按顺序执行的。
    https://img1.sycdn.imooc.com//climg/62d1334f09477ed116290339.jpg
    参考代码如下:

    # coding:utf-8
    import threading
    import random,time
    
    class CandyDivide(object):
        def __init__(self, candy_list, kids_get):
            self.candy_list = candy_list
            self.kids_get = kids_get
    
        def candy_divide(self, kid):
            while len(self.candy_list) > 0:
                if len(self.kids_get[kid]) < 20:
                    candy=random.choice(candy_list)
                    candy_list.remove(candy)
                    # candy = self.candy_list.pop()
                    self.kids_get[kid].append(candy)
                    print(str(kid)+"号小朋友共有了"+str(len(self.kids_get[kid]))+"块糖~~~~~~~~~~~~~~~~~当前糖果列表是"+str(self.kids_get[kid]))
                else:
                    break
    
    
    if __name__ == '__main__':
        candy_list = ['candy%s' % i for i in range(1, 101)]
        kids_get = {1: [], 2: [], 3: [], 4: [], 5: []}
        solution = CandyDivide(candy_list, kids_get)
        for i in range(1, 6):
            t = threading.Thread(target=solution.candy_divide, args=(i,))
            t.start()
        for key, value in solution.kids_get.items():
            print(f'{key}号小孩得到的糖果为{value}')


    祝学习愉快~


    2022-07-15 17:30:31
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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