首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我无法理解以下代码中的执行流。无法解释错误以及输出

我无法理解以下代码中的执行流。无法解释错误以及输出
EN

Stack Overflow用户
提问于 2017-12-30 20:38:21
回答 1查看 142关注 0票数 1

在下面的代码片段中,我试图理解simpy教程。我无法解释输出结果。我希望在打印其他语句之前,所有的"\o/“都会一次打印出来。此外,回调也有一个问题。

代码语言:javascript
复制
    import simpy
    class School:
    def __init__(self, env):
        self.env = env
        self.class_ends = env.event()
        self.pupil_procs = [env.process(self.pupil()) for i in range(3)]
        for x in self.pupil_procs:
            x.callbacks.append(self.my_callback(x))
            #print(x.callbacks)

        self.bell_proc = env.process(self.bell())

    def bell(self):
        for i in range(2):
            value=yield self.env.timeout(45,value="bell_rang!at"+str(env.now))
            self.class_ends.succeed(value='class_ends!')
            print("in bell proc")
            self.class_ends = self.env.event()
            print(value)


    def pupil(self):
        for i in range(2):
            print(' \o/',i, end=' ')
            classends=yield self.class_ends
            print('done!')
            print(classends)

    def my_callback(self,event):
        print('Called back from',event)


env = simpy.Environment()
school = School(env)
env.run()

产出如下:

代码语言:javascript
复制
Called back from <Process(pupil) object at 0x7fd7ddce97b8>
Called back from <Process(pupil) object at 0x7fd7ddce9be0>
Called back from <Process(pupil) object at 0x7fd7ddcad5f8>
 \o/ 0  \o/ 0  \o/ 0 in bell proc
bell_rang!at0
done!
class_ends!
 \o/ 1 done!
class_ends!
 \o/ 1 done!
class_ends!
 \o/ 1 in bell proc
bell_rang!at45
done!
class_ends!
done!
class_ends!
done!
class_ends!
Traceback (most recent call last):
  File "/home/deeplearning/PycharmProjects/python-scheduling/learnSimPy/learnmore.py", line 35, in <module>
    env.run()
  File "/usr/local/lib/python3.5/dist-packages/simpy/core.py", line 137, in run
    self.step()
  File "/usr/local/lib/python3.5/dist-packages/simpy/core.py", line 221, in step
    callback(event)
TypeError: 'NoneType' object is not callable

Process finished with exit code 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-02 12:32:53

self.my_callback(x) (即None)的结果添加到回调列表中。

相反,您应该追加functools.partial(self.my_callback, x)

我还建议您使用yield from process而不是将函数附加到process的回调中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48037678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档