当前位置: 首页 > wzjs >正文

乐清英文网站建设怎么把网站排名排上去

乐清英文网站建设,怎么把网站排名排上去,网站建设公司的市场营销方案模板下载,如何在网上做网站推广在 asyncio 的异步编程框架中,如果说 asyncio.StreamReader 是你异步应用的数据输入管道,那么 asyncio.StreamWriter 就是你异步应用的数据输出管道。它是一个至关重要的组件,让你能够方便、高效且非阻塞地向连接的另一端(如 TCP …

asyncio 的异步编程框架中,如果说 asyncio.StreamReader 是你异步应用的数据输入管道,那么 asyncio.StreamWriter 就是你异步应用的数据输出管道。它是一个至关重要的组件,让你能够方便、高效且非阻塞地向连接的另一端(如 TCP 套接字)发送字节数据

你可以把 StreamWriter 想象成一个异步的、非阻塞的“数据发送器”。当你调用它的方法来发送数据时,它不会立即把所有数据都推送到网络或底层I/O。相反,它会将数据放入自己的内部缓冲区,并通知事件循环有数据待发送。如果网络繁忙,数据暂时无法发送,StreamWriter 会让出控制权,让事件循环去执行其他任务,直到数据可以被真正写入后再继续。


StreamWriter 的核心职能与价值

asyncio.StreamWriter 主要用于向异步 I/O 源(通常是网络套接字或进程间的管道)高效地写入字节数据。它的核心价值体现在以下几个方面:

  1. 异步非阻塞写入:这是其最核心的特性。StreamWriter 提供的所有写入方法都是非阻塞的。当底层I/O(如网络)因缓冲区满而暂时无法接收更多数据时,写入操作不会阻塞你的整个程序。StreamWriter 会暂停当前的写入任务,允许事件循环处理其他协程,直到数据能够被写入。
  2. 智能内部数据缓冲StreamWriter 内部维护一个输出缓冲区。你写入的数据会先进入这个缓冲区。它会尝试批量发送数据到操作系统底层,减少系统调用次数,提高发送效率。
  3. 流量控制 (Flow Control):这是 StreamWriter 的一个高级特性。当底层传输层(如 TCP 缓冲区)变得拥塞,无法立即发送更多数据时,StreamWriter 会自动暂停数据的写入,直到拥塞缓解。这通过其 drain() 方法得到体现,它能确保数据被“排空”到网络中,而不是无限堆积在应用程序层缓冲区。
  4. 优雅处理连接关闭StreamWriter 提供了明确的方法来关闭连接(如 close()),并且能够让你等待所有待发送数据发送完毕,确保数据的完整传输。

如何获取 StreamWriter 实例?

StreamReader 一样,你通常不会直接实例化 asyncio.StreamWriter。它总是与 StreamReader 成对出现,并通过 asyncio 库的以下两个核心函数获得:

  1. 作为客户端连接 (asyncio.open_connection())
    当你需要作为客户端连接到远程服务器时,asyncio.open_connection() 会建立 TCP 连接,并返回一个包含 (StreamReader, StreamWriter) 的元组。StreamWriter 用于向服务器发送数据。

    import asyncioasync def connect_and_write_client():host, port = 'localhost', 8888print(f"Trying to connect to {host}:{port}...")writer = None # Pre-define writer for finally blocktry:# open_connection returns (StreamReader, StreamWriter) tuplereader, writer = await asyncio.open_connection(host, port)print(f"Successfully connected to {host}:{port}")# --- Using StreamWriter to send data ---message_to_send = "Hello from async client!"print(f"Sending message: '{message_to_send}'")writer.write(message_to_send.encode()) # Write bytes to the bufferawait writer.drain() # Crucial: ensures data is pushed to the network# Optionally, read server's response using StreamReaderprint("Waiting for server response...")data = await reader.read(100)if data:response = data.decode()print(f"Received server response: '{response}'")else:print("Server did not send data or closed connection.")except ConnectionRefusedError:print(f"Connection refused. Make sure the server is running on {host}:{port}.")except Exception as e:print(f"Client encountered an unexpected error: {e}")finally:if writer and not writer.is_closing(): # Check if writer exists and is not already closingprint("Closing client connection...")writer.close() # Close the writer (and underlying socket)await writer.wait_closed() # Wait for the writer to fully closeprint("Connection fully closed.")if __name__ == "__main__":# To run this client example, first start a compatible server (e.g., the echo_server below).# asyncio.run(connect_and_write_client())pass # Not running directly to allow server to be started first
    
  2. 作为服务器处理连接 (asyncio.start_server())
    当你使用 asyncio.start_server() 启动 TCP 服务器时,每当有新的客户端连接到来,你提供的连接处理回调函数就会被调用。这个回调函数会接收到 (StreamReader, StreamWriter) 元组,其中 StreamWriter 代表了向该客户端发送数据的通道。

    import asyncioasync def echo_server_handler(reader: asyncio.StreamReader, writer: asyncio.StreamWriter):"""Coroutine to handle each new client connection."""addr = writer.get_extra_info('peername') # Get client address infoprint(f"Accepted new connection from {addr!r}.")try:while True:# Read data from the client using StreamReaderdata = await reader.read(1024) if not data: # If data is empty, client has disconnectedprint(f"Client {addr!r} disconnected.")break # Exit loop to close connectionmessage = data.decode().strip()print(f"Received from {addr!r}: '{message}'")# --- Using StreamWriter to send a response ---response_message = f"Server received your message: {message}"print(f"Sending response to {addr!r}: '{response_message}'")writer.write(response_message.encode()) # Write bytes to the bufferawait writer.drain() # Crucial: ensures data is sent over the networkexcept asyncio.IncompleteReadError:print(f"Client {addr!r} disconnected before full read.")except ConnectionResetError:print(f"Client {addr!r} forcibly closed the connection.")except Exception as e:print(f"Error handling {addr!r}: {e}")finally:print(f"Closing connection with {addr!r}.")writer.close() # Close the writer (and underlying socket)await writer.wait_closed() # Wait for the writer to fully closeprint(f"Connection with {addr!r} fully closed.")async def run_echo_server():host, port = 'localhost', 8888server = await asyncio.start_server(echo_server_handler, host, port)addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)print(f"Server listening on {addrs}...")# server.serve_forever() keeps the server running until the event loop stopsasync with server:await server.serve_forever()if __name__ == "__main__":# Run this script to start the server.# After starting, you can connect with the client example above or# using 'telnet localhost 8888' in another terminal.asyncio.run(run_echo_server())
    

StreamWriter 的常用方法详解

StreamWriter 提供了一系列用于发送数据和管理连接的异步方法。请注意,它主要操作字节数据

  1. writer.write(data)

    • 作用:将 data(必须是 bytesbytearray 对象)写入 StreamWriter内部缓冲区
    • 行为:这是一个非协程方法,它会立即返回。数据并不会立即发送到网络,而是被放置到写入器的内部缓冲区中等待发送。
    • 重要性:这个方法仅仅是“排队”数据,它不保证数据已经发送出去了。要确保数据被发送到网络,你通常需要紧接着调用 await writer.drain()
    • 示例writer.write(b"Hello, Server!")
  2. await writer.drain()

    • 作用关键的异步方法,用于实现流量控制。它等待内部写入缓冲区中的数据被完全“排空”(drain),即所有数据都已发送到操作系统底层的网络缓冲区。
    • 行为:如果内部缓冲区中有数据待发送,且底层网络缓冲区已满或数据发送速度跟不上生产速度,drain()挂起当前协程,直到所有数据发送完毕,或底层网络缓冲区有足够的空间接收更多数据。
    • 重要性:在写入大量数据或确保某个消息块被完整发送后才能继续执行后续逻辑时,drain() 至关重要。任何重要的写入操作后,都应考虑调用 await writer.drain()。否则,数据可能仍在 Python 应用程序的缓冲区中,而未真正发出去。
    • 示例writer.write(b"Large data chunk"); await writer.drain()
  3. writer.writelines(list_of_data)

    • 作用:将一个包含 bytesbytearray 对象的列表写入内部缓冲区。
    • 行为:与 write() 类似,这是一个非协程方法,仅将列表中的所有数据依次放入缓冲区。
    • 重要性:同样需要结合 await writer.drain() 来确保数据发送。
    • 示例writer.writelines([b"Line 1\n", b"Line 2\n"])
  4. writer.can_write_eof()

    • 作用:同步方法,检查传输层是否支持发送 EOF (End-Of-File) 标志。
    • 行为:返回 TrueFalse。对于 TCP 套接字,通常返回 True
    • 应用场景:在需要明确通知对端不再有数据发送,但又不立即关闭连接时(例如半关闭连接)。
  5. writer.write_eof()

    • 作用:发送一个 EOF 标志到对端。这表明此端将不再发送数据,但仍可以接收数据。
    • 行为:这是一个非协程方法,仅排队发送 EOF 标志。
    • 重要性:发送 EOF 后,通常应调用 await writer.drain() 来确保 EOF 标志被送出。
  6. writer.close()

    • 作用:请求关闭写入器及其关联的底层传输层(如套接字)。
    • 行为:这是一个非协程方法,它会立即返回。它将关闭操作放入队列。在调用 close() 之后,不应再进行写入操作。
    • 重要性:通常在使用完 StreamWriter 后调用,以释放资源。
  7. await writer.wait_closed()

    • 作用:等待写入器完全关闭。
    • 行为:这是一个协程方法。它会挂起当前协程,直到 writer.close() 操作完成,并且所有底层资源都被释放。
    • 重要性:在使用 writer.close() 后,强烈建议调用 await writer.wait_closed()。这能确保在程序继续执行之前,所有待发送的数据都已尝试发送,并且底层连接已正确关闭,避免资源泄露或数据丢失。这在 finally 块中尤其有用。
    • 示例writer.close(); await writer.wait_closed()
  8. writer.is_closing()

    • 作用:同步方法,检查写入器是否正在关闭中。
    • 行为:返回 True 如果 close() 已经被调用,但 wait_closed() 还没有完成。
    • 应用场景:在编写复杂的连接管理逻辑时,可以用于判断当前写入器的状态。
  9. writer.get_extra_info(name, default=None)

    • 作用:获取关于底层传输层的额外信息,例如远程地址、本地地址等。
    • 行为:返回指定名称的信息。
    • 常见参数'peername' (远程地址), 'sockname' (本地地址), 'compression', 'cipher' (SSL/TLS 信息)。
    • 示例peername = writer.get_extra_info('peername')

StreamWriter 的内部工作原理(简述)

当你调用 writer.write() 方法时:

  1. 数据首先被添加到 StreamWriter内部输出缓冲区
  2. StreamWriter 会通知事件循环,表示其内部缓冲区中有数据待发送。
  3. 事件循环会在合适的时机(通常是当底层网络套接字准备好接收数据时),将缓冲区中的数据异步地写入到底层套接字。
  4. 如果你调用 await writer.drain(),并且此时底层网络缓冲区已满或数据发送有延迟,drain()挂起当前协程。事件循环会继续处理其他任务,直到底层缓冲区有空间或数据发送完毕后,再恢复被挂起的协程。
  5. 当你调用 writer.close() 时,StreamWriter 会尝试发送所有剩余的缓冲数据,然后关闭底层套接字。await writer.wait_closed() 则会等待这一系列关闭操作完成。

这种设计确保了数据发送的高效性和非阻塞性,即使网络拥塞,你的应用程序也能保持响应。


StreamWriterStreamReader 的协同

StreamReaderStreamWriter 几乎总是成对出现,共同代表了一个完整的、双向的异步通信通道。它们通过底层的 asyncio 传输层(Transport)进行协作,传输层负责具体的网络 I/O。

理解如何同时使用 StreamReader 进行数据接收和 StreamWriter 进行数据发送,是构建任何基于 asyncio 的网络应用(无论是客户端还是服务器)的核心。它们提供了一个高层次的抽象,让你可以专注于应用逻辑,而不必陷入底层的套接字细节和非阻塞 I/O 的复杂性中。


总结

asyncio.StreamWriterasyncio 框架中用于非阻塞数据发送的核心组件。它通过智能的内部缓冲和流量控制机制,确保数据能够高效且可靠地从你的异步应用程序发送到网络或其他 I/O 目标。

掌握 StreamWriterwrite()drain()(尤其重要!)、close()wait_closed() 方法,是编写健壮、高性能、响应迅速的异步网络服务和客户端的关键。它与 StreamReader 共同构筑了 asyncio 异步 I/O 的强大基石。

http://www.dtcms.com/wzjs/317252.html

相关文章:

  • 建设好学校网站做互联网项目怎么推广
  • 成都微信网站建设公司哪家好下载百度app最新版并安装
  • 印度电商平台网站建设策划十大搜索引擎排名
  • 做网站如何月入10万网推获客平台
  • 一个主机一个域名做网站seo实战培训王乃用
  • 企业网站建设定位注意的问题杭州优化公司在线留言
  • 网站服务公司哪个好查看域名每日ip访问量
  • 郴州市宜章网站建设南昌seo实用技巧
  • 中国移动网上商城优化营商环境心得体会个人
  • 网站备案幕布照规范五个成功品牌推广案例
  • 家电网站策划福州短视频seo公司
  • 114百事通做网站600网上销售平台有哪些
  • 上海专业做网站公合肥网站优化方案
  • 顺义网站制作windows优化大师怎么用
  • 做网站的模版seo优化工具软件
  • 大连 网站制作 外贸酒吧营销用什么软件找客源
  • 效果好企业营销型网站建设网页设计成品源代码
  • 网站的关键词推扩是怎样做百度网盘app官网
  • 医院网站怎么做优化排名企业培训内容有哪些
  • 谁能帮我做网站seo百度关键词优化软件
  • 团队展示网站人民日报今日新闻
  • 高端企业网站建设费用南昌百度seo
  • 酒店网站可以怎么做杭州seo俱乐部
  • 营销型网站建设报价方案goole官网
  • 抚州网站制作企业软文
  • 临沂集团网站建设抖音怎么运营和引流
  • 湖南网站建设开发百度站内搜索的方法
  • 建网站靠什么赚钱品牌策划公司
  • 晋城市网站建设网站排名监控工具
  • 网站建设思路方案网络营销怎么推广