2015-02-02 2 views
0

현재 어려운 문제가 있습니다.일부 이벤트가 완료되어 파이썬에서 다른 이벤트가 발생했습니다.

내가 같은 2+ 이벤트를 가지고 말 :

  • (A) : 사용자 액션 B를 할

각 이벤트 : 사용자 작업에게

  • (B)를 할 다른 사용자와 분리되어 있으며 사용자가 웹 요청에서 시작할 수 있으며 자신의 순서 (어느 것이 먼저 발생하는지)를 알지 못합니다. 그런 다음

    , A와 B 모두가 발생하는 경우, 그것은 또 다른 이벤트라고 C 실행됩니다 : A + B => C

    이 거기에 어떤 프로그래밍 모델이나 라이브러리를 파이썬에서 쉽게, 내가 선호하는 순수 파이썬 내가 GAE와 일하기 때문에.

    나는 몇 가지 추가 코드로 깜박임을 사용하는 방법에 대해 생각해 봤지만 여전히 많은 작업을하고 있습니다.

  • 답변

    2

    blinker는 순수한 Python이므로 GAE에서 사용하는 것이 매우 적합해야합니다. 입력 신호가 아니라 "올 수없는 경우 확실히 - and gate, 내가 지시등 제공하지 않습니다 생각 -

    은 그래서 당신은 이 개 다른 신호가 수신 된 신호를 트리거의 문제를 남겨 시간과 공간에서 분리되었다. 해당 엔티티 '키의 ID로 users.get_user().userid()를 사용

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

    :

    는 그래서 같은 모델을 정의하는 것입니다.

    그리고 우리는이, 나는 N>2 신호를 게이트 앞으로 생각하고 두 신호와 중복 조금 보이는

    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() 
    

    signal(A).connect(got_a)signal(B).connect(got_b)이있을 것이다하지만이 아니라면 당신은 분명히이 문제를 단순화 할 수 있습니다 문제가 있습니다.

    예, 필요한 경우 원자 트랜잭션, 하나의 신호 만 받았고 일부 임계 값 X보다 오래되어보고되는 등등을 찾는주기적인 "가비지 수집"작업 등이 있습니다. 그러나, 당신의 사양을 올바르게 이해한다면 그것은 "작품의 많은 부분"으로 보일 수 없습니다.

    +0

    고마워요,이게 내가 찾고있는 것입니다. 난 그냥 원자 트랜잭션에 대해 조금 궁금해, 나는 그것을 잘 할 수있는 MySQL과 함께, 이것은 처음으로 NDB와 함께 일하고있다. – Tarzan

    +1

    하나의 엔티티, 가장 작은 엔티티 그룹을 다루기 때문에 :-),'def' 앞에 데코레이터'@ ndb.transactional'을 추가하기 만하면됩니다. 여러 엔터티를 대상으로 거래해야하는 경우에만 단일 엔터티 그룹, 즉 공통 조상을 공유해야합니다. –

    +0

    오, 고마워. 너무 쉽습니다, xD. – Tarzan

    0

    이 도움이 될 수 감사합니다 :

    1 .- 경쟁 조건을 피하십시오 : 당신이 DB를 사용하는 경우 경우, A 또는 B를 작성하는 트랜잭션/잠금 테이블/잠금 행을 사용 스레드를 사용하고 있습니다. Threading.Lock() 또는 비슷한 것을 사용하십시오.

    2. 트리거 조건이 충족되면 transacction/lock을 확인한 다음 실행하십시오.

    관련 문제