gevent.socket
--低层协同组网接口#
此模块提供套接字操作和一些相关功能。函数和类的API与标准中相应项的API匹配 socket
模块完全正确,但此模块中的同步功能只会阻塞当前greenlet并让其他模块运行。
小技巧
与大多数gevent对象一样,gevent的套接字具有线程关联性。也就是说,它们只能从创建它们的操作系统线程中使用(该线程中的任何greenlet都可以使用套接字)。尝试在另一个线程中使用套接字的结果(例如,将其传递给threadpool)尚未定义(但一个常见结果是 LoopExit
例外)。
为方便起见,例外情况(如 error
和 timeout
)以及 socket
模块导入到此模块中。在几乎所有情况下,都可以简单地替换 import socket
具有 from gevent import socket
开始使用没有其他更改的协作套接字(或使用 gevent.monkey.patch_socket()
启动时,如果不需要或不可能更改代码)。
标准库接口#
此模块公开的确切API因所使用的Python版本而异。下面的文档分别描述了Python2和Python3的API。
备注
所有描述的API都应该从 gevent.socket
和 not 从它们的实现模块。他们的组织是一个可以随时更改的实现细节。
- class socket[源代码]#
合作套接字对象。有关详细信息,请参阅版本文档。
在 20.12.0 版本发生变更: 套接字对象不再具有
__dict__
或者接受任意实例变量。以前它们是这样做的,但标准库套接字从来没有这样做。
- Python 3接口
SocketType
socket
socket.accept()
socket.bind()
socket.connect()
socket.connect_ex()
socket.detach()
socket.dup()
socket.fileno()
socket.get_inheritable()
socket.getblocking()
socket.getpeername()
socket.getsockname()
socket.getsockopt()
socket.gettimeout()
socket.listen()
socket.makefile()
socket.recv()
socket.recv_into()
socket.recvfrom()
socket.recvfrom_into()
socket.send()
socket.sendall()
socket.sendfile()
socket.sendto()
socket.set_inheritable()
socket.setblocking()
socket.setsockopt()
socket.settimeout()
socket.shutdown()
socket.family
socket.proto
socket.type
create_connection()
fromfd()
getaddrinfo()
getfqdn()
gethostbyaddr()
gethostbyname()
gethostbyname_ex()
getnameinfo()
socketpair()
GEvent扩展#
除了基本的标准库接口, gevent.socket
提供一些扩展。这些是相同的,并且由所有版本的Python共享。
在 1.3a2 版本发生变更: 无证阶层 BlockingResolver
已记录并移至 gevent.resolver.blocking.Resolver
.
等待#
这些函数用于阻塞当前greenlet,直到打开的文件(socket)准备好执行I/O操作。这些是许多程序不常用的低级功能。
备注
它们使用底层事件循环 io
观察者,这意味着他们共享相同的实现限制。例如,在某些平台上,它们不仅可以与套接字一起使用,而在其他平台上,其适用性则更为有限(Linux和OS X等POSIX平台可以使用管道和FIFO,但Windows仅限于套接字)。
备注
在带有libev事件循环的Windows上,gevent被限制为1024个打开的套接字。
- wait_read(fileno, timeout=None[, timeout_exc=None]) None [源代码]#
阻止当前的greenlet,直到 文件描述符 准备好阅读了。
有关其他参数和可能的异常的含义,请参见
wait()
.
- wait_write(fileno, timeout=None[, timeout_exc=None]) None [源代码]#
阻止当前的greenlet,直到 文件描述符 准备好写了。
有关其他参数和可能的异常的含义,请参见
wait()
.自 1.1 版本弃用: 关键字参数 事件 被忽略。应用程序不应传递此参数。将来,这样做将成为一个错误。
- wait_readwrite(fileno, timeout=None[, timeout_exc=None]) None [源代码]#
阻止当前的greenlet,直到 文件描述符 准备好读或写。
有关其他参数和可能的异常的含义,请参见
wait()
.自 1.1 版本弃用: 关键字参数 事件 被忽略。应用程序不应传递此参数。将来,这样做将成为一个错误。
- wait(watcher, timeout=None[, timeout_exc=None]) None #
阻止当前的greenlet,直到 观察者 准备好了。
如果 超时 是非负的,那么 timeout_exc 在之后提升 超时 第二个已经过去了。
如果
cancel_wait()
是被调用的 watcher 通过另一个小程序,在此阻塞小程序中引发异常 (socket.error(EBADF, 'File descriptor was closed in another greenlet')
默认情况下)。- 参数:
watcher -- 事件循环观察程序,通常是从
gevent.core.loop.io()
timeout_exc -- 超时过期时引发的异常。默认情况下,a
socket.timeout
引发异常。如果传递此关键字的值,则会将其解释为gevent.timeout.Timeout
.
- 抛出:
ConcurrentObjectUseError -- 如果 观察者 已启动。