반응형

pubsub 구조로 메시지를 보내고 받는다.

쓰면서 느끼는 점은 로컬 컴퓨터 내에서 데이터 공유 목적으로 사용하기 좋은 것 같다.

프로그램 규모가 커지면 단일 파일의 코드 줄 수도 긴 만큼, 단위 모듈로 작업할 때 데이터 공유용으로 쓰면 되겠다.

사용방법 [1]

pypubsub은 다음 명령어로 설치할 수 있다.

pip install pypubsub

 

기본적인 구조는 다음과 같다.

보낼 사람(Publisher)와 받는 사람(Subscriber)는 직접 주고 받는 것이 아닌 topic을 통해서 데이터를 주고받는다.

프로그램 간의 종속성이 덜하고 누구나 보내고 받을 수 있다는 장점이 있지만, 누가 보내고 받는지는 모른다.

Concept of Pypubsub [1]

사용 예시는 다음과 같다.

1
2
3
4
5
6
7
8
9
# Publishing Data
pub.sendMessage(topicName='TOPIC_NAME', msgData=MSG_DATA)
 
# Subscribing Data
pub.subscribe(_subscribe_callback, 'TOPIC_NAME')
 
# Subscribing callback
def _subscribe_callback(msgData):
    # Place your code
cs

 

코드 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from pubsub import pub
import threading
import time
 
class Sub_Tester():
    def __init__(self):
        pub.subscribe(self.show_user_message, 'msg1')
        pub.subscribe(self.show_user_message, 'msg2')
 
    # Subscribing callback
    def show_user_message(self, msgData):
        print(msgData)
        for key in msgData:
            print(key, msgData[key])
 
class Pub_Tester():
    def __init__(self):
        self.value = 1
        self._send_heartbeat()
 
    def __del__(self):
        self.timer_heartbeat.cancel()
 
    def _send_heartbeat(self):
        self.timer_heartbeat = threading.Timer(0.2self._send_heartbeat)
        self.timer_heartbeat.daemon = True # 안하면 프로그램 종료(Ctrl+C)를 눌러도 살아있음. 프로그램이 잘 안꺼짐
        self.timer_heartbeat.start()
        self.value = self.value + 1
        pub.sendMessage(topicName='msg1', msgData={"HEARTBEAT"self.value})
 
    def send_pub1(self):
        pub.sendMessage(topicName='msg2', msgData={'PUB1':[123]})
 
    def send_pub2(self):
        pub.sendMessage(topicName='msg2', msgData={'PUB2':[456]})
 
 
if __name__ == "__main__":
    
    print("\t\tNo of thread : {}".format(threading.active_count()))
    subscriber = Sub_Tester()
    publisher = Pub_Tester()
 
    while True:
        print("\t\tNo of thread : {}".format(threading.active_count()))
        time.sleep(1)
        publisher.send_pub1()
        publisher.send_pub2()
cs

 

결과물

Publisher는 Heartbeat를 5Hz으로 (25줄 참고)

pub 메시지를 1Hz으로 (44~48줄 참고) 보내고 있다.

해당 토픽 이름과 내용을 출력하도록 했을 때 다음과 같다.

 

Reference

[1] Pypubsub, https://pypubsub.readthedocs.io/en/v4.0.3/

 

EOF

728x90

+ Recent posts