헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤
2010년 12월 17일 금요일
gevent, 하나의 소켓을 두개의 그린렛이 공유할때 한쪽이 소켓을 닫아버리면?
돌다리는 두들겨야 제맛.
[code python]
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
# gevent 사용시 하나의 그린렛이 소켓에 대고 뭔가를 읽으려고 블럭중인데
# 다른 그린렛이 그 소켓을 닫아버릴경우 어떤일이 생기는가를 테스트해본 코드.
#
# 결론만 적자면
# victim 과 killer 가 sock 을 공유하고 victim 이 sock 에대고 블러킹
# recv 를 하는 도중에 killer 가 sock 을 닫아버리면 victim 쪽에서는
# recv 가 "" 를 리턴해주는 형태로 진행.
import gevent
import gevent.socket
def victim(sock):
print("victim started")
buf = sock.recv(1024)
print("victim ended")
# 외부에서 소켓을 닫을경우 recv 가 "" 를 리턴해준다. gracefully
# closed 된 상황으로 인식하고 진행하면 되겠군.
assert type(buf) == str and buf == ""
# 혹시나 끊어진 sock 에 대고 send 를 하면 EBADF 가 떨어진다.
def killer(sock, n):
print("killer started")
gevent.sleep(n)
print("killer shoots")
sock.close()
print("killer ended")
if __name__ == "__main__":
# 공유할 소켓
sock = gevent.socket.create_connection(("127.0.0.1",7777))
# 소켓읽다 뒤질놈
gevent.spawn(victim, sock)
# n 초 뒤에 소켓 죽일놈
gevent.spawn(killer, sock, 1)
# join 걸기 귀찮아서 그냥 슬립으로
gevent.sleep(3)
[/code]
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기