- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个场景,我正在使用 python 电路框架动态创建具有自己 channel 的新组件。我希望在所有创建的 channel 都触发特定事件时收到通知。
我尝试过使用成功事件,但它会在每个 channel 上独立触发,所以我每个 channel 都有一个。对我来说,使用不同的 channel 是有意义的,因为在不同的数据集上执行相同的任务。
我目前的解决方案是记录创建的 channel 名称,然后监听结束事件(下面的“boom”)并从列表中删除触发 channel 。当列表为空时,我可以停下来。下面是一个例子。它有效,但我觉得应该有一种更优雅的方式在这些 channel 结束后加入它们。
import time
import sys
from circuits import Component, Event
from circuits.core.debugger import Debugger
class boom(Event):
"boom event"
class Start(Component):
def __init__(self, channel="*"):
super(Start, self).__init__(channel=channel)
self._boom_channels = []
return
def started(self, *args):
for i in [1,2]:
channel = 'channel_{}'.format(i)
self._boom_channels.append(channel)
new = Middle(channel=channel).register(self)
def boom(self, event, *args):
new_chans = set(self._boom_channels) - set(event.channels)
self._boom_channels = list(new_chans)
print self._boom_channels
if not self._boom_channels:
sys.exit()
class Middle(Component):
def __init__(self, channel="*"):
super(Middle, self).__init__(channel=channel)
time.sleep(2)
self.fire(boom())
return
if __name__ == '__main__':
(Start() + Debugger()).run()
最佳答案
我相信您的想法是正确的。由于这些是离散事件,因此如果不跟踪它们就无法确定它们何时全部完成(我不认为)。
让您的示例更好的唯一方法是:
#!/usr/bin/env python
from __future__ import print_function
from circuits import Component, Debugger, Event
class boom(Event):
"boom event"
class Start(Component):
channel = "start"
def init(self, channel=channel):
self.boom_channels = []
def started(self, *args):
for i in [1, 2]:
channel = "channel_{}".format(i)
self.boom_channels.append(channel)
Middle(channel=channel).register(self)
def boom(self, middle):
self.boom_channels.remove(middle.channel)
if not self.boom_channels:
raise SystemExit(0)
class Middle(Component):
def registered(self, component, manager):
self.fire(boom(self), manager)
return
def main():
app = (Start() + Debugger())
app.run()
if __name__ == '__main__':
main()
输出:
$ python test.py
<registered[*] (<Debugger/* 1156:MainThread (queued=0) [S]>, <Start/start 1156:MainThread (queued=2) [R]> )>
<started[start] (<Start/start 1156:MainThread (queued=1) [R]> )>
<registered[channel_1] (<Middle/channel_1 1156:MainThread (queued=0) [S]>, <Start/start 1156:MainThread (queued=2) [R]> )>
<registered[channel_2] (<Middle/channel_2 1156:MainThread (queued=0) [S]>, <Start/start 1156:MainThread (queued=2) [R]> )>
<boom[<Start/start 1156:MainThread (queued=2) [R]>] (<Middle/channel_1 1156:MainThread (queued=0) [S]> )>
<boom[<Start/start 1156:MainThread (queued=1) [R]>] (<Middle/channel_2 1156:MainThread (queued=0) [S]> )>
<stopped[start] (<Start/start 1156:MainThread (queued=0) [S]> )>
编辑:一些注意事项:
boom()
事件推送给管理器。boom()
事件。关于Python电路加入 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24822986/
我有一个骨架化的体素结构,如下所示: 实际结构比这个例子大很多有没有办法找到结构中的闭环?我尝试将其转换为图形并使用基于图形的方法,但它们都存在图形没有节点位置的空间信息的问题,因此图形可以具有多个同
我正在尝试使用 Stem 启动 Tor 连接,然后列出所选的节点。 使用他们网站上的其他问题和常见问题解答,我可以做其中之一,但不能同时做。 例如,我可以启动一个 Tor 电路 tor_proce
问题如下:考虑三个输入 A、B、C,找到一个带有 AND、OR 和 NOT 门的 bool 电路,使得输出不是(A),不是(B),不是(C),最多使用 2 个 NOT盖茨。 我想用prolog找到电路
我连接了两个按钮和五个 LED。在电路中它的顺序是按钮,五个LED和按钮。 LED 的顺序从左到右(从第一个按钮开始)红色、绿色、蓝色、绿色和红色。我使用蓝色(中间)LED 来区分左侧和右侧。按下左按
我是一名优秀的程序员,十分优秀!