python3异步_python 3-多个异步连接

本文介绍了Python3异步编程中如何处理多个异步连接。重点讲解了使用`asyncio.open_connection`和`asyncio.start_server`作为高级替代方案进行连接和服务器创建。通过示例展示了`Node`类的实现,包含`run`、`server_init`和`client_method`方法,用于处理服务器和客户端的异步操作。文章还提到了Python3.7引入的`asyncio.create_task`和`asyncio.run`,并提醒读者这些可能会随着版本更新而变化。
摘要由CSDN通过智能技术生成

对于任何一个Asyncio新手都有同样的问题,我自己找到了解决方案。

首先,最好使用异步的高级方面--

streams

. 打电话

loop.create_connction

loop.create_server

被认为是低级的(我起初理解错误)。

高级替代品

create_connection

asyncio.open_connection

,它将为您提供一个由

asyncio.StreamReader

asyncio.StreamWriter

可用于读取和写入打开的连接。当数据从

StreamReader

等于

b''

或者当你发现一个例外(

ConnectionError

)当试图写信给

StreamWriter

.

高级替代品

create_server

asyncio.start_server

,需要提供一个回调函数,每次与服务器建立连接时都会调用该函数(打开连接,接收数据…)。回调有

流读出器

流写器

作为争论。连接丢失也可以通过接收来检测

B’

连接错误

在写信给

writer

.

多个连接可以由协程处理。服务器部分可以有一个协程(它接受来自环拓扑中一个邻居的连接),客户机部分可以有一个协程(它打开到环中另一个邻居的连接)。这个

Node

类可以如下所示:

import asyncio

class Node:

...

async def run(self):

...

self.next_reader, self.next_writer = await asyncio.open_connection(self.next_IP, self.next_port)

server_coro = asyncio.create_task(self.server_init())

client_coro = asyncio.create_task(self.client_method())

await client_coro

await server_coro

...

async def server_init(self):

server = await asyncio.start_server(self.server_callback, self.IP, self.port)

async with server:

await server.serve_forever()

async def client_method(self):

...

try:

data = await self.next_reader.read()

except ConnectionError:

...

...

注意我正在使用

asyncio.create_task

对于协程和(不在代码列表中)

asyncio.run(node.run())

被认为是

asyncio.ensure_future()

loop.run_forever()

. 这两个都是在python 3.7中添加的,并且

asyncio.run()

据说是临时的,所以到你读到这篇文章的时候,可能已经被别的东西取代了。

我不是一个异步专家,所以可能有一种更好、更干净的方法(如果你知道的话,请分享)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值