๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๐ŸŒฎ ๐Ÿ’ฌ

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป/python12

MQTT Keep Alive ์ตœ๊ทผ์— MQTT ํ†ต์‹  ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ Keep Alive ์„ค์ •์— ๊ด€๋ จํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ๋‹ค. Status Update ํ•˜๋Š” mqtt ํด๋ผ์ด์–ธํŠธ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ์„ฑํ•˜๊ณ send_status ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค. import paho.mqtt.client as mqttimport uuidimport timeclass RobotStatusUpdater: def __init__(self, broker_ip, topic="robot/status"): self.client = mqtt.Client(f"Robot_Status_Updater_{uuid.uuid4()}") self.client.connect(broker_ip, 1883) self.topic = to.. 2025. 3. 12.
Redis ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐœ์š”ํ…Œ์ŠคํŠธ ์ง„ํ–‰ํ•˜๋Š”๋ฐ redis๋ฅผ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋ ค๊ณ  ํ•จ์ง„ํ–‰Redis ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธRedis์˜ ๋ชจ๋“  ์š”์ฒญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด:redis-cli monitor → Redis์˜ ๋ชจ๋“  ์ž‘์—…์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•œ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ  ์žˆ์–ด์„œ ๊ฐ€๋…์„ฑ์ด ์ข‹์ง€ ์•Š๋‹ค. Celery ์ž์ฒด ๋ชจ๋‹ˆํ„ฐ๋งRedis์˜ ๋กœ๊ทธ ์ค‘์—์„œ ๋‚ด๊ฐ€ ๋“ฑ๋กํ•œ celery app์— ๋Œ€ํ•œ ๋กœ๊ทธ๋งŒ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์–ด์„œ ์ฐพ์•„๋ดค๋Š”๋ฐ, Celery์—์„œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” celery ์ž์ฒด ๋ชจ๋‹ˆํ„ฐ๋ง์ด ์žˆ์—ˆ๋‹ค.โœ… celery worker ์‹คํ–‰ํ•  ๋•Œ -E ์˜ต์…˜ ์ถ”๊ฐ€ํ•ด์„œ ์ด๋ฒคํŠธ ๋กœ๊น… ํ™œ์„ฑํ™”ํ•˜๊ธฐ (์•„๋‹ˆ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์•ˆ๋œธ)pkill -9 -f "celery worker" # ๊ธฐ์กด ์›Œ์ปค ์ข…๋ฃŒcelery -A celery_tasks.c.. 2025. 2. 13.
Redis and Celery ๊ฐœ์š”Redis์™€ Celery์˜ ๊ด€๊ณ„๋ฅผ ์ข€ ๋” ์ž์„ธํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค.์ •๋ฆฌRedis์™€ Celery๋Š” ๋น„๋™๊ธฐ ํƒœ์Šคํฌ ํ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ฐ๊ฐ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์™€ ๋ฐฑ์—”๋“œ ์ €์žฅ์†Œ ์—ญํ• ์„ ํ•œ๋‹ค.Celery๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ถ„์‚ฐ ํƒœ์ŠคํŠธ ํ ์‹œ์Šคํ…œ์œผ๋กœ, ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค(Message Broker)๋ฅผ ํ†ตํ•ด ์ž‘์—… ๊ด€๋ฆฌProducer (Client)์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ์„ ๋ณด๋ƒ„Celery๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•„ Redis์— ์ž‘์—…์„ ๋“ฑ๋ก(Queue)ํ•จBroker (Redis)Celery๊ฐ€ ์‹คํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์„ ํ(Queue) ํ˜•ํƒœ๋กœ ์ €์žฅWorker๊ฐ€ ๋Œ€๊ธฐํ•˜๋‹ค๊ฐ€ ์ž‘์—…์„ ๊ฐ€์ ธ๊ฐ€์„œ ์‹คํ–‰Worker (Celery Worker)Redis์—์„œ ์ž‘์—…์„ ๊บผ๋‚ด ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅ์—ฌ๋Ÿฌ ๊ฐœ์˜ Worker๊ฐ€ ๋™์‹œ์— ์‹คํ–‰ ๊ฐ€๋Šฅ (๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ)Bac.. 2025. 2. 12.
Celery๋ฅผ ์ด์šฉํ•œ ํฌ๋กค๋ง ์˜ˆ์ œ ๊ฐœ์š”Airflow์™€ Celery๋ฅผ ๋น„๊ตํ–ˆ๋‹ค. ํฌ๋กค๋ง ๊ด€๋ฆฌ Airflow vs Celery๊ฐœ์š”๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ํฌ๋กค๋ง ์‹œ์Šคํ…œ์„ Airflow๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค.Airflow ์šด์˜ ์ค‘์ด๋˜ ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋Š” ๋ฐ, ๊ทธ ์ค‘์—์„œ ์ œ์ผ ํฐ ๋ฌธ์ œ๋Š” cpu ์ ์œ ์œจ์ด 100์œผ๋กœ ์น˜์†Ÿ์„ ๋•Œ๊ฐ€ ๋งŽ์•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.Airflow๋กœ ์šด์˜bonory.tistory.com ํฌ๋กค๋ง ์ง„ํ–‰ ์‹œ, Celery๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋” ์ ํ•ฉํ•˜๋‹ค๋Š” ํŒ๋‹จ๊ณผ ํ•จ๊ป˜ ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. FastAPI + Celery + requests + BeautifulSoup ๋ฅผ ํ™œ์šฉํ•œ ํฌ๋กค๋ง ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์„ ์˜ˆ์ œํฌ๋กค๋ง์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ์ง„ํ–‰๊ธฐ๋ณธ ๊ตฌ์กฐFastAPI: ์‚ฌ์šฉ์ž๊ฐ€ API๋ฅผ ํ†ตํ•ด ํฌ๋กค๋ง ์š”์ฒญ์„ ๋ณด๋ƒ„Celery: ์š”์ฒญ์„ ํ์— ๋„ฃ๊ณ , ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ .. 2025. 2. 5.
[python] gRPC ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ gRPC์™€ websocket์„ ๋น„๊ตํ•ด๋ณด์•˜๋‹ค [gRPC] gRPC๊ณผ websocket ๋น„๊ต ์ •๋ฆฌ๊ธฐ์กด์— ๊ฐœ๋ฐœํ–ˆ๋˜ ์„œ๋น„์Šค์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ํ†ต์‹ ์„ websocket ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.๋‹ค ๋๋‚ด๊ณ ๋‚˜์„œ ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ข€ ๋” ์„œ์น˜ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค๊ทธ๋ ‡๊ฒŒ ์•Œ๊ฒŒ๋œ gRPC. ์ •๋ฆฌํ•ด๋ณด์ž โœ… gRPCbonory.tistory.com ์ต์ˆ™ํ•˜์ง€ ์•Š์€ gRPC๋ฅผ python์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค 1. Protocol Buffers (Protobuf) ์ •์˜gRPC์˜ ํ•ต์‹ฌ์€ API ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” Protobuf ํŒŒ์ผ์ด๋‹ค!.proto ํŒŒ์ผ ์ž‘์„ฑํ•œ๋‹ค = ์„œ๋น„์Šค์™€ ๋ฉ”์‹œ์ง€์˜ ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•œ๋‹ค greeter.protosyntax = "proto3";service Greeter { rpc Sa.. 2025. 1. 2.
[python] PySide6๋กœ ์˜ฌ๋ฆฐ gui๋กœ ์›๊ฒฉ ์„œ๋ฒ„์˜ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ ๊ฐœ์š”์ด๋ฒˆ์— ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธํ•ด์„œ 2๊ฐ€์ง€๋ฅผ ๊ฐœ๋ฐœํ•ด์•ผํ–ˆ๋‹ค. 1. ์›๊ฒฉ ์„œ๋ฒ„์— ์žˆ๋Š” ํŒŒ์ผ์„ ๋กœ์ปฌ์— ๋‹ค์šด๋กœ๋“œํ•ด์•ผํ•œ๋‹ค. (ํŒŒ์ผ์ด ์ปค์„œ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋‹ˆ, progress bar๋กœ ์ง„ํ–‰ ์‚ฌํ•ญ์„ ๋ณด์—ฌ์ฃผ์ž)2. PySide6๋กœ gui๋ฅผ ์˜ฌ๋ฆฐ๋‹ค. 1๏ธโƒฃ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œimport paramikoimport timedef download_file(hostname, port, username, password, remote_file_path, local_file_path, progress_callback): try: start = time.perf_counter() ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(par.. 2024. 12. 31.
[python] Fastapi ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ exe ํŒŒ์ผ๋กœ ๋ฐฐํฌํ•˜๊ธฐ ๊ฐœ์š”์›น ์„œ๋น„์Šค๋ฅผ ์ฝ”๋“œ ๊ณต๊ฐœ ์—†์ด ์™ธ๋ถ€์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก exe ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค ํ•จํ™•์ธFastapi ์„œ๋ฒ„๋Š” python์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ pyinstaller ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ํŒŒ์ผ์„ ํŒจํ‚ค์ง•ํ•˜๋ ค ํ•จ์ง„ํ–‰1. main.py ์—์„œ if __name__ == "__main__": ๋ธ”๋ก์œผ๋กœ ์‹คํ–‰๋˜๋Š” uvicorn ๋ถ„๋ฆฌํ•˜๊ธฐ์ด์œ pyinstaller๋Š” application์„ ํŒจํ‚ค์ง•ํ•  ๋•Œ model import ์ˆœ์„œ์™€ ์ฐธ์กฐ ๋ฐฉ์‹์— ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.if __name__ == "__main__": ๋ธ”๋ก์„ ์ •์ƒ์ ์œผ๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ด์„œ ASGI ์„œ๋ฒ„(์ฆ‰, uvicorn)๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•œ๋‹ค.์ง„ํ–‰main.py ์—์„œ๋Š” ๋‹จ์ˆœํžˆ Fastapi ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ •์˜ํ•˜๋Š” ์—ญํ• ๋งŒ ํ•˜๊ณ , run_server.py์—์„œ main.py๋ฅผ m.. 2024. 11. 5.
[python] socket ๋™์‹œ ์—ฐ๊ฒฐ ์ตœ๊ทผ์— ๊ฐœ๋ฐœํ•œ ๊ธฐ๋Šฅ ์ค‘์— 2๊ฐœ์˜ ๋กœ๋ด‡๊ณผ socket ํ†ต์‹ ์ด ์žˆ์—ˆ๋‹ค.2๊ฐœ์˜ ๋กœ๋ด‡์— ๋™์‹œ์— ์š”์ฒญ์ด ๋“ค์–ด๊ฐ€๋ฉด 1๋ฒˆ ๋กœ๋ด‡ → 2๋ฒˆ ๋กœ๋ด‡ ์ด๋ ‡๊ฒŒ ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋˜์–ด์„œ๋™์‹œ์— ์ง„ํ–‰๋˜๋„๋ก ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.ํ™•์ธ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ฐฉ์‹, ๋น„๋™๊ธฐ ๋ฐฉ์‹ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ์—ฐ๊ฒฐ์„ ๋™์‹œ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹คimport socketimport threading# ์ฒซ ๋ฒˆ์งธ ์†Œ์ผ“ ์—ฐ๊ฒฐ ํ•จ์ˆ˜def connect_to_robot_a(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('123.123.123.123', 65432)) # ๋ฐ์ดํ„ฐ ์ „์†ก ์˜ˆ์‹œ data = "Hello from .. 2024. 10. 22.
[python] fastapi ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ์ด๋ฏธ์ง€ ์†ก์ถœ ์ด๋ฒˆ์— ์ƒˆ๋กœ ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ์–ผ๊ตด ์ธ์‹์œผ๋กœ ํ•˜๋Š” ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์ด์—ˆ๋‹ค์–ผ๊ตด ์ธ์‹ํ•˜๋Š” model์€ cvteam์—์„œ ๋ฐ›์•„์„œ ๋‚˜๋Š” ui์— ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š” ์ƒํ™ฉmain.pyfrom fastapi import FastAPIfrom fastapi.responses import StreamingResponseimport cv2app = FastAPI()def generate_frames(): cap = cv2.VideoCapture(0) while True: success, frame = cap.read() if not success: break ret, buffer = cv2.imencode('.jpg', frame) .. 2024. 10. 21.