共计 2558 个字符,预计需要花费 7 分钟才能阅读完成。
动动发财的小手,点个赞吧!
asyncio 的一个次要益处是可能应用非阻塞流。
1. 异步流
Asyncio 提供非阻塞 I/O 套接字编程。这是通过流提供的。
能够关上提供对流写入器和流写入器的拜访的套接字。而后能够应用协同程序从流中写入和读取数据,并在适当的时候暂停。实现后,能够敞开套接字。
异步流性能是低级的,这意味着必须手动实现所需的任何协定。
这可能包含常见的 Web 协定,例如:
- 用于与 Web 服务器交互的 HTTP 或 HTTPS
- 用于与电子邮件服务器交互的 SMTP
- 用于与文件服务器交互的 FTP。
这些流还可用于创立服务器以应用标准协议解决申请,或开发您本人的特定于应用程序的协定。
当初咱们晓得什么是异步流,让咱们看看如何应用它们。
2. 如何关上连贯
能够应用 asyncio.open_connection() 函数关上 asyncio TCP 客户端套接字连贯。
这是一个必须期待的协程,一旦套接字连贯关上就会返回。
该函数返回用于与套接字交互的 StreamReader 和 StreamWriter 对象。
...
# open a connection
reader, writer = await asyncio.open_connection(...)
asyncio.open_connection() 函数采纳许多参数来配置套接字连贯。两个必须的参数是主机和端口。
host 是一个字符串,指定要连贯的服务器,例如域名或 IP 地址。
port 为 socket 端口号,如 HTTP 服务器为 80,HTTPS 服务器为 443,SMTP 为 23 等。
...
# open a connection to an http server
reader, writer = await asyncio.open_connection('www.google.com', 80)
通过 SSL 协定反对加密套接字连贯。最常见的例子可能是正在取代 HTTP 的 HTTPS。这能够通过将“ssl”参数设置为 True 来实现。
...
# open a connection to an https server
reader, writer = await asyncio.open_connection('www.google.com', 443, ssl=True)
3. 如何启动服务器
能够应用 asyncio.start_server() 函数关上 asyncio TCP 服务器套接字。这是一个必须期待的协程。
该函数返回一个代表正在运行的服务器的 asyncio.Server 对象。
...
# start a tcp server
server = await asyncio.start_server(...)
三个必须的参数是回调函数、主机和端口。回调函数是一个由名称指定的自定义函数,每次客户端连贯到服务器时都会调用该函数。
主机是客户端将指定连贯的域名或 IP 地址。端口是接管连贯的套接字端口号,例如 21 用于 FTP 或 80 用于 HTTP。
# handle connections
async def handler(reader, writer):
# ...
...
# start a server to receive http connections
server = await asyncio.start_server(handler, '127.0.0.1', 80)
4. 如何应用 StreamWriter 写入数据
咱们能够应用 asyncio.StreamWriter 将数据写入套接字。数据以字节模式写入。能够应用 write() 办法将字节数据写入套接字。
...
# write byte data
writer.write(byte_data)
或者,能够应用 writelines() 办法写入组织成列表或可迭代的多“行”字节数据。
...
# write lines of byte data
writer.writelines(byte_lines)
写入数据块或挂起调用协程的办法都没有。写入字节数据后,最好通过 drain() 办法清空套接字。这是一个 Coroutine,将暂停呼叫者,直到传输字节并筹备好插座为止。
...
# write byte data
writer.write(byte_data)
# wait for data to be transmitted
await writer.drain()
5. 如何应用 StreamReader 读取数据
咱们能够应用 asyncio.StreamReader 从套接字读取数据。数据以字节格局读取,因而字符串在应用前可能须要进行编码。所有读取办法都是必须期待的协程。
能够通过 read() 办法读取任意数量的字节,该办法将始终读取到文件开端 (EOF)。
...
# read byte data
byte_data = await reader.read()
此外,能够通过“n”参数指定要读取的字节数。如果您晓得下一个响应的预期字节数,这可能会有所帮忙。
...
# read byte data
byte_data = await reader.read(n=100)
能够应用 readline() 办法读取单行数据。这将返回字节,直到遇到换行符“\n”或 EOF。
这在浏览应用文本行操作的标准协议时很有用。
...
# read a line data
byte_line = await reader.readline()
此外,还有一个 readexactly() 办法来读取确切数量的字节,否则会引发异样,还有一个 readuntil() 办法将读取字节,直到读取字节模式的指定字符。
6. 如何敞开连贯
能够通过 asyncio.StreamWriter 敞开套接字。能够调用 close() 办法来敞开套接字。此办法不会阻塞。
...
# close the socket
writer.close()
尽管 close() 办法不会阻塞,但咱们能够期待套接字齐全敞开后再持续。这能够通过 wait_closed() 办法来实现。这是一个能够期待的协程。
...
# close the socket
writer.close()
# wait for the socket to close
await writer.wait_closed()
咱们能够通过 is_closing() 办法查看套接字是否曾经敞开或正在敞开。
...
# check if the socket is closed or closing
if writer.is_closing():
# ...
本文由 mdnice 多平台公布