Python asyncio 如何在Asyncio中获得非阻塞SSL套接字?
因此,我可以非常轻松地在asyncio中创建Python asyncio 如何在Asyncio中获得非阻塞SSL套接字?,python-asyncio,Python Asyncio,因此,我可以非常轻松地在asyncio中创建SSLSocket: # Create a Socket sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) sock.setblocking(False) # Connect await loop.sock_connect(sock, host_address) # type: ignore # Create an SSL Context ssl_context = ssl.cre
SSLSocket
:
# Create a Socket
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
sock.setblocking(False)
# Connect
await loop.sock_connect(sock, host_address) # type: ignore
# Create an SSL Context
ssl_context = ssl.create_default_context(cafile=PROXY_CA_BUNDLE)
...
# Wrap the SSL Context Around the Socket
def do_handshake(loop, sock, waiter):
sock_fd = sock.fileno()
try:
sock.do_handshake()
except ssl.SSLWantReadError:
loop.remove_reader(sock_fd)
loop.add_reader(sock_fd, do_handshake,
loop, sock, waiter)
return
except ssl.SSLWantWriteError:
loop.remove_writer(sock_fd)
loop.add_writer(sock_fd, do_handshake,
loop, sock, waiter)
return
loop.remove_reader(sock_fd)
loop.remove_writer(sock_fd)
waiter.set_result(None)
waiter = loop.create_future()
do_handshake(loop, sslconn, waiter)
await waiter
问题是SSLSocket是原始套接字库的一部分,因此它不再与其他异步IO方法兼容,如
asyncio.sock\u sendall
。有没有一种方法可以代替包装套接字并使其仍然尊重原始套接字接口?为什么要尝试使用低级循环。删除\u reader()
和循环。添加\u reader()
API而不是streams API?例如,支持创建SSL连接-您可以使用它吗?不幸的是,我不能使用streams API;我需要将套接字传递到Cython应用程序,该应用程序需要一个默认的python套接字。Cython应用程序需要一个阻塞套接字还是非阻塞套接字?此外,如果应用程序需要套接字,为什么要将其连接到asyncio事件循环?非阻塞套接字(如上所述)。Usecase基本上是使用asyncio构建代理连接(HTTP),然后需要cython协议的原始套接字。如果唯一的问题是asyncio不能与包装的套接字一起工作,那么我会调用高级API,然后获取它使用的套接字。例如,子类SSLContext
并提供一个impl,用于存储由super()创建的SSLSocket
。将套接字(…)
包装到您选择的位置。使用ssl=
调用并设置代理后,可以提取SSLSocket
并将其传递给Cython。为什么要尝试使用低级循环。删除\u reader()
和循环。添加\u reader()
API而不是streams API?例如,支持创建SSL连接-您可以使用它吗?不幸的是,我不能使用streams API;我需要将套接字传递到Cython应用程序,该应用程序需要一个默认的python套接字。Cython应用程序需要一个阻塞套接字还是非阻塞套接字?此外,如果应用程序需要套接字,为什么要将其连接到asyncio事件循环?非阻塞套接字(如上所述)。Usecase基本上是使用asyncio构建代理连接(HTTP),然后需要cython协议的原始套接字。如果唯一的问题是asyncio不能与包装的套接字一起工作,那么我会调用高级API,然后获取它使用的套接字。例如,子类SSLContext
并提供一个impl,用于存储由super()创建的SSLSocket
。将套接字(…)
包装到您选择的位置。使用ssl=
调用并设置代理后,您可以提取SSLSocket
并将其传递给Cython。