2017-12-15 3 views
0

3 개의 스레드가 있습니다. 각 스레드는 val을 저장합니다. 그리고 각 스레드는 websocket으로부터 메시지를받습니다. 각 스레드에서 on_message()이 호출되면 val이 업데이트되고 주 스레드에서 함수를 호출하여 모든 스레드 3 개 중 val을 합산하려고합니다.다른 스레드의 주 스레드에서 함수 호출?

thread1.start() 
thread2.start() 
thread3.start() 

내 현재 솔루션이 코드는 100 %의 CPU를 사용하여 반복적으로 더 val 업데이트되지 않더라도 sum를 계산하는 것을

while True: 
    sum = thread1.val + thread2.val + thread3.val 

문제가있다. 하지만 sleep()을 사용하고 싶지 않습니다. 어떤 스레드에서든지 val이 업데이트되면 최대한 빨리 계산해야합니다. 나는 큐를 사용하는 방법에 대해 읽었지만 Queue을 사용하고 싶지 않다. on_message()이 스레드 1, 2 또는 3에서 호출 될 때 주 스레드에서 함수를 호출하는 방법이 있습니까?

+0

각 스레드에서'on_message()'가 호출 될 때, 나머지 두 개의'vals '가 합산에 어떻게 사용 가능한지 어떻게 확신 할 수 있습니까? 쓰레드는 "어디서나"함수를 호출 할 수 있습니다. 함수는 단지 코드 일 뿐이며 언제든지 모든 스레드에서 실행할 수 있습니다. 필요한 값을 아직 사용할 수 없다면 처리를 완료하지 못할 수도 있습니다. – martineau

+0

블럭을 제외하고 실제로 시도해 보았습니다. – LooksMoneyStatus

+0

불행히도, 그것이 내가 의미했던 바가 아닙니다. 단지 모든 것이 만들어 질 때까지 값을 합할 수 없다는 것입니다. 당신이 받아 들였던 대답은 "마지막 사건"이 있다는 의미에서 그 문제를 다루기 위해서입니다. (하지만 그것은 나에게는 분명하지 않습니다.) – martineau

답변

2

Queue 실제로 이것에 대해 적절한 방법이 될 것입니다. 각 업데이트 된 값에 대기열이 추가되고 주 스레드는 매번 항목이 추가 될 때까지 대기합니다. 어떤 종류의 "이벤트 스트림"으로 포맷 할 수 있으므로 어디서 왔는지 알 수 있습니다.

{ 
    "source": "THREAD_A", 
    "value": 42 
} 

난 당신이 produce() 기능의 몇 가지 종류가 각 스레드에 있으리라 믿고있어 : 큐의 각 값은 같을 수 있습니다. 그것은 다음과 같이 보일 수 있습니다 메인 스레드에서

def produce(event_queue): 
    while True: 
     value = do_something() 
     event_queue.put({"source": ME, "value": value}) 

그리고 다음을 :

values = {"THREAD_A": 0, "THREAD_B": 0, "THREAD_C": 0} 
while True: 
    s = sum(values.values()) 
    # ... 
    last_event = event_queue.get() 
    values[last_event["source"]] = last_event["value"] 

get() 기능은 다음 이벤트가 들어올 때까지 기다려야 메인 스레드가 발생, 다음이 계속 프로세스가 값. 따라서 새 메시지가 도착할 때마다 정확히 한 번씩 다시 계산됩니다.

on_message() 메타포를 계속 사용하려면 on_message()이라고하는 값으로 last_event을 사용하고 그 메소드의 내부로 바로 이어지는 모든 것을 생각하면됩니다. 내 말은, 원한다면 독자적인 방법으로 쓸 수 있다는 것입니다.

values = {"THREAD_A": 0, "THREAD_B": 0, "THREAD_C": 0} 
def on_message(v, message): 
    v[last_event["source"]] = last_event["value"] 
    s = sum(v.values()) 
    # ... 

while True: 
    last_message = event_queue.get() 
    on_message(values, last_message) 

희망 사항은 약간의 아이디어를 제공합니다.