2013-06-24 40 views
0

我在讀gevent.socket,但我不明白。gevent socket如何阻塞當前的greenlet?

def recv(self, *args): 
    sock = self._sock # keeping the reference so that fd is not closed during waiting 
    while True: 
     try: 
      return sock.recv(*args) 
     except error, ex: 
      if ex[0] == EBADF: 
       return '' 
      if ex[0] != EWOULDBLOCK or self.timeout == 0.0: 
       raise 
      # QQQ without clearing exc_info test__refcount.test_clean_exit fails 
      sys.exc_clear() 
     try: 
      wait_read(sock.fileno(), timeout=self.timeout, event=self._read_event) 
     except error, ex: 
      if ex[0] == EBADF: 
       return '' 
      raise 

recvsock_realsocket(family, type, proto)一個實例。而在socket.py中我發現:

import _socket 
_realsocket = _socket.socket 

什麼是_socket? return sock.recv(*args)爲什麼不阻止整個程序?

回答

1

_socket是python的標準c庫,它提供真正的網絡通信, 和socket.py(在標準庫或gevent中)包裝方法以供常用。

然後,考慮初始化在gevent.socket類Socket的

```self._sock.setblocking(0)``` 

這一聲明使Socket對象非阻塞