一些已完成的活动在 python 中制作另一个活动

Some events completed make another event in python

我目前遇到了一个难题。

说我有2+个事件,比如:

每个事件都是相互独立的,可以由用户通过网络请求触发,我不知道它们的顺序(哪个先发生)。

然后,当 A 和 B 都发生时,它将触发另一个名为 C 的事件:A + B => C

在 Python 中是否有任何编程模型或库使它更容易,我更喜欢纯 python 只是因为我正在使用 GAE。

我已经考虑过使用 blinker 和一些附加代码,但它仍然有很多工作。

谢谢,

这可能有帮助:

1.- 避免竞争条件:如果您使用的是数据库,请使用 transaction/lock table/lock 行来写入 A 或 B,如果您使用的是线程,请使用 Threading.Lock () 或类似的东西

2.- 在transacction/lock内部检查是否满足触发条件,然后执行。

@lock
def a():
    do_a
    if b:
        do_c

@lock
def b():
    do_b
    if a:
        do_c

既然blinker是纯粹的Python,用在GAE上应该是很可行的。

因此,当收到 两个 其他信号时,您会遇到触发信号的问题 -- and gate,我相信信号灯不会提供 -- 绝对不是当传入信号可以及时到达 "well separated" 并且 space.

所以我会定义一个模型,例如:

class AndGate(ndb.Model):
    a_received = ndb.BooleanProperty()
    b_received = ndb.BooleanProperty()

使用 users.get_user().userid() 作为其实体键中的 ID。

然后我们有 signal(A).connect(got_a)signal(B).connect(got_b) 以及

def got_a(*_):
    k = ndb.Key('AndGate', users.get_user().userid())
    ag = k.get()
    if ag is None:
        AndGate(a_received=True, b_received=False, key=k).put()
        return
    if ag.b_received:
        k.delete()
        signal('C').send('')
    else:
        ag.a_received = True
        ag.put()

这看起来有点多余,只有两个信号,我正在考虑带有 N>2 信号的门,但如果这对您来说不是问题,您肯定可以简化它。

是的,还有工作要做——如果需要,原子事务,周期性 "garbage collection" 任务寻找 gates 其中只收到一个信号并且早于某个阈值 X 并报告它们,等等。但是,如果我没有正确理解您的规格,对我来说似乎 "much of works"。