一些已完成的活动在 python 中制作另一个活动
Some events completed make another event in python
我目前遇到了一个难题。
说我有2+个事件,比如:
- (A):用户执行操作 A
- (B):用户执行操作 B
每个事件都是相互独立的,可以由用户通过网络请求触发,我不知道它们的顺序(哪个先发生)。
然后,当 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"。
我目前遇到了一个难题。
说我有2+个事件,比如:
- (A):用户执行操作 A
- (B):用户执行操作 B
每个事件都是相互独立的,可以由用户通过网络请求触发,我不知道它们的顺序(哪个先发生)。
然后,当 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"。