반응형
pubsub 구조로 메시지를 보내고 받는다.
쓰면서 느끼는 점은 로컬 컴퓨터 내에서 데이터 공유 목적으로 사용하기 좋은 것 같다.
프로그램 규모가 커지면 단일 파일의 코드 줄 수도 긴 만큼, 단위 모듈로 작업할 때 데이터 공유용으로 쓰면 되겠다.
사용방법 [1]
pypubsub은 다음 명령어로 설치할 수 있다.
pip install pypubsub
기본적인 구조는 다음과 같다.
보낼 사람(Publisher)와 받는 사람(Subscriber)는 직접 주고 받는 것이 아닌 topic을 통해서 데이터를 주고받는다.
프로그램 간의 종속성이 덜하고 누구나 보내고 받을 수 있다는 장점이 있지만, 누가 보내고 받는지는 모른다.
사용 예시는 다음과 같다.
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.2, self._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':[1, 2, 3]})
def send_pub2(self):
pub.sendMessage(topicName='msg2', msgData={'PUB2':[4, 5, 6]})
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
'SW' 카테고리의 다른 글
[PYTHON] CANable로 CAN 통신하기 - candle_driver (0) | 2023.08.06 |
---|---|
[PyQt5] callback 함수에 인자로 함수 포인터와 값 전달하기 (0) | 2023.08.06 |
[토막] Python decorator (0) | 2023.07.27 |
[토막] Python 코드 실행 시간 측정 (0) | 2023.07.27 |
C++ Singleton pattern with template (0) | 2023.06.09 |