์ต๊ทผ์ ๊ฐ๋ฐํ ๊ธฐ๋ฅ ์ค์ 2๊ฐ์ ๋ก๋ด๊ณผ socket ํต์ ์ด ์์๋ค.
2๊ฐ์ ๋ก๋ด์ ๋์์ ์์ฒญ์ด ๋ค์ด๊ฐ๋ฉด 1๋ฒ ๋ก๋ด → 2๋ฒ ๋ก๋ด ์ด๋ ๊ฒ ์์๋๋ก ์งํ๋์ด์
๋์์ ์งํ๋๋๋ก ํด๋ณด๋ ค๊ณ ํ๋ค.
ํ์ธ
๋ฉํฐ์ค๋ ๋ ๋ฐฉ์, ๋น๋๊ธฐ ๋ฐฉ์ ๋๊ฐ์ง๊ฐ ์๋ค.
๋ฉํฐ์ค๋ ๋
๋ฉํฐ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ์์ผ ์ฐ๊ฒฐ์ ๋ณ๋์ ์ค๋ ๋์์ ์ฒ๋ฆฌํ์ฌ ๋ ๊ฐ์ ์ฐ๊ฒฐ์ ๋์์ ๊ด๋ฆฌํ ์ ์๋ค
import socket
import 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 Robot A"
s.sendall(data.encode())
response = s.recv(1024).decode()
print(f"Robot A response: {response}")
s.close()
# ๋ ๋ฒ์งธ ์์ผ ์ฐ๊ฒฐ ํจ์
def connect_to_robot_b():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('123.123.123.123', 65433))
# ๋ฐ์ดํฐ ์ ์ก ์์
data = "Hello from Robot B"
s.sendall(data.encode())
response = s.recv(1024).decode()
print(f"Robot B response: {response}")
s.close()
# ๋ฉ์ธ ํจ์์์ ๋ ์ค๋ ๋๋ฅผ ์์
if __name__ == "__main__":
thread_robot_a = threading.Thread(target=connect_to_robot_a)
thread_robot_b = threading.Thread(target=connect_to_robot_b)
# ๋ ์ค๋ ๋ ์์
thread_robot_a.start()
thread_robot_b.start()
# ๋ ์ค๋ ๋๊ฐ ๋๋ ๋๊น์ง ๋๊ธฐ
thread_robot_a.join()
thread_robot_b.join()
print("Both connections completed.")
๋น๋๊ธฐ(asyncio) ๋ฐฉ์
๋น๋๊ธฐ ๋ฐฉ์์ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ํตํด ๋ ์์ผ ์ฐ๊ฒฐ์ ๋์์ ์ฒ๋ฆฌ ๊ฐ๋ฅ. ๋คํธ์ํฌ I/O ์์ ์์๋ ๋ฉํฐ์ค๋ ๋๋ณด๋ค ๋ ํจ์จ์ ์ด๋ค.
import asyncio
async def connect_to_robot_a():
reader, writer = await asyncio.open_connection('123.123.123.123', 65432)
# ๋ฐ์ดํฐ ์ ์ก ์์
data = "Hello from Robot A"
writer.write(data.encode())
await writer.drain()
# ์๋ฒ๋ก๋ถํฐ ์๋ต ๋ฐ๊ธฐ
response = await reader.read(1024)
print(f"Robot A response: {response.decode()}")
writer.close()
await writer.wait_closed()
async def connect_to_robot_b():
reader, writer = await asyncio.open_connection('123.123.123.123', 65433)
# ๋ฐ์ดํฐ ์ ์ก ์์
data = "Hello from Robot B"
writer.write(data.encode())
await writer.drain()
# ์๋ฒ๋ก๋ถํฐ ์๋ต ๋ฐ๊ธฐ
response = await reader.read(1024)
print(f"Robot B response: {response.decode()}")
writer.close()
await writer.wait_closed()
# ๋ฉ์ธ ๋น๋๊ธฐ ํจ์
async def main():
await asyncio.gather(
connect_to_robot_a(),
connect_to_robot_b(),
)
if __name__ == "__main__":
asyncio.run(main())
์ ๋ฆฌ
๋น๋๊ธฐ(asyncio)์ ๋ฉํฐ์ค๋ ๋(threading)๋ ๊ฐ๊ฐ์ ์ํฉ์ ๋ฐ๋ผ ์ ํฉํ ์ ํ์ด ๋ ์ ์์ง๋ง,
์์ผ ํต์ ๊ณผ ๊ฐ์ I/O ๋ฐ์ด๋ ์์ ์์๋ ๋น๋๊ธฐ ๋ฐฉ์์ด ์ผ๋ฐ์ ์ผ๋ก ๋ ๋์ ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ์ ์ ๊ณตํ๋ค.
๋ฉํฐ ์ค๋ ๋ | ๋น๋๊ธฐ | |
์ฅ์ | 1. CPU ๋ฐ์ด๋ ์์
์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅ (๋จ, Python์ *GIL๋ก ์ธํด ํ์ ์ ์ธ ๋ณ๋ ฌ์ฑ) 2. ๋ฉํฐ์ค๋ ๋ฉ์ ์ ํต์ ์ธ ๋์์ฑ ์ฒ๋ฆฌ ๋ฐฉ์์ด๋ฏ๋ก, ๋น๋๊ธฐ ๋ฐฉ์์ ๋นํด ์ง๊ด์ ์ธ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅ 3. ์ด๋ฏธ ๋ฉํฐ์ค๋ ๋ฉ์ ์ต์ํ ๊ฒฝ์ฐ, ๊ตฌํ๊ณผ ๋๋ฒ๊น ์ด ๋ ์ฌ์ธ ์ ์๋ค |
1. ๋จ์ผ ์ค๋ ๋์์ ์ฌ๋ฌ ์์
์ ๋์์ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์, ์ค๋ ๋ ์ค๋ฒํค๋๊ฐ ์์ 2. ๋คํธ์ํฌ ํต์ ๊ณผ ๊ฐ์ I/O ์์ ์์๋ ๋น๋๊ธฐ ๋ฐฉ์์ด ๋ ํจ์จ์ . CPU ์์์ ๊ฑฐ์ ์๋ชจํ์ง ์์ผ๋ฉฐ, I/O ์์ ์ด ๋๋ ๋๊น์ง ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ 3. ์์ผ ํต์ ์ฒ๋ผ ๋น๋๊ธฐ ๋คํธ์ํฌ ์์ ์ด ๋ง์ ๋, ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ํ ์ ์๋ค 4. ์ฝ๋๊ฐ ๋ช ํํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๊ตฌ์กฐ๋ก ์์ฑ ๊ฐ๋ฅ |
๋จ์ | 1. ์ค๋ ๋ ์ค๋ฒํค๋: ์ค๋ ๋ ์์ฑ๊ณผ ๊ด๋ฆฌ์ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ์ CPU ์์์ด ์๋ชจ 2. ๋๊ธฐํ ์ด์: ๋ฉํฐ์ค๋ ๋ฉ์ ์ข ์ข ๋ฐ๋๋ฝ, ๋ ์ด์ค ์ปจ๋์ ๊ณผ ๊ฐ์ ๋ณต์กํ ๋ฌธ์ ๋ค์ ์ผ์ผํฌ ์ ์๋ค. 3. ์์ผ ํต์ ์ฒ๋ผ I/O ์์ ์ด ๋ง์ ํ๊ฒฝ์์๋ ์ค๋ ๋๊ฐ *์ ํด ์ํ๋ก ๋๊ธฐ ํ๋ ์๊ฐ์ด ๋ง์์ ๋นํจ์จ์ ์ผ ์ ์๋ค. |
1. CPU ๋ฐ์ด๋ ์์
(์: ๋ฐ์ดํฐ ๋ถ์, ๋ณต์กํ ๊ณ์ฐ ๋ฑ)์์๋ ์ ํฉํ์ง ์๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ GIL(Global Interpreter Lock) ๋ฌธ์ ๋ก ์ธํด asyncio๋ง์ผ๋ก๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ํ๋ค ์ ์๋ค. 2. ๋น๋๊ธฐ ํจํด์ ์ต์ํ์ง ์๋ค๋ฉด ์ฝ๋ ์์ฑ ๋ฐ ๋๋ฒ๊น ์ด ์กฐ๊ธ ๋ณต์กํ ์ ์๋ค. |
์ถ์ฒ ์ํฉ | 1. ์์ผ ํต์ , ํ์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ์ ๊ฐ์ I/O ๋ฐ์ด๋ ์์
2. ๋์์ฑ ์ฒ๋ฆฌ๊ฐ ์ค์ํ๊ณ , ์ฌ๋ฌ I/O ์์ ์ ๋นํจ์จ์ ์ผ๋ก ๊ธฐ๋ค๋ฆฌ๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ |
1. CPU ๋ฐ์ด๋ ์์
(๋ณต์กํ ๊ณ์ฐ ์์
)์์ ์ ์ฉ 2. ๋ฉํฐ์ฝ์ด ์์คํ ์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ, ๋ฉํฐํ๋ก์ธ์ฑ๊ณผ ๊ฒฐํฉํ์ฌ ๋ ๋์ ์ฑ๋ฅ์ ๋ผ ์ ์๋ค |
*GIL: Global Interpreter Lock์ ์ฝ์๋ก, ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๊ฐ ํ์ด์ฌ ๋ฐ์ดํธ์ฝ๋๋ฅผ ํ๋ฒ์ ํ๋๋ง ์ฌ์ฉํ ์ ์๊ฒ Lock์ ๊ฑฐ๋ ๊ฒ
*์ ํด ์ํ: ์ปดํจํฐ ์์คํ ์ด ์ฌ์ฉ ๊ฐ๋ฅํ ์ํ์ด๋ ์ค์ ์ ์ธ ์์ ์ด ์๋ ์๊ฐ