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]   








댓글 없음: