[python] socket λμ μ°κ²°
μ΅κ·Όμ κ°λ°ν κΈ°λ₯ μ€μ 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μ κ±°λ κ²
*μ ν΄ μν: μ»΄ν¨ν° μμ€ν μ΄ μ¬μ© κ°λ₯ν μνμ΄λ μ€μ μ μΈ μμ μ΄ μλ μκ°