python - 如何使 send() 调用异步?

标签 python sockets asynchronous sendasynchronousrequest

服务器正在运行为nc -l 1234


下面是使用事件循环的 select() 调用在 recv() 上未被阻止的客户端。

客户端.py

import socket
import sys
from eventloop import EventLoop

class Connection():
    def __init__(self):
        self.sock = socket.socket()
        self.sock.connect(('localhost', 1234))

    def fileno(self):
        return self.sock.fileno()

    def onRead(self):
        msg = self.sock.recv(1000).decode('utf-8')
        print(msg)

    def send(self, msg):
        self.sock.send(msg)

class Input():
    def __init__(self, sock):
        self.sock = sock

    def fileno(self):
        return sys.stdin.fileno()

    def onRead(self):
        msg = sys.stdin.readline().encode('utf-8')
        self.sock.send(msg)

sock = Connection()
inputReader = Input(sock)

eventLoop = EventLoop()
eventLoop.addReader(sock)
eventLoop.addReader(inputReader)
eventLoop.runForever()

eventloop.py

import select

class EventLoop():
    def __init__(self):
        self.readers = []

    def addReader(self, reader):
        self.readers.append(reader)

    def runForever(self):
        while True:
            readers, _, _ = select.select(self.readers, [], [])
            for reader in readers:
                reader.onRead()

但是 self.sock.send(msg) 调用可能会因不同原因而被阻止:

1)服务器崩溃

2) 由于网线损坏,无法访问远程服务器(不是 localhost)


如何使send()调用不被阻塞?只需抛出消息并继续执行其余功能...而不使用 asyncio

最佳答案

How to make send() call not blocked?

通过使用非阻塞套接字,即self.sock.setblocking(0)。请注意,发送可能会失败,您必须捕获这一点。发送也可能不会发送所有给定的数据,但对于阻塞套接字也是如此,您只是忽略了这个问题。

鉴于您当前的阻塞 connect 没有问题,您应该仅在阻塞 connect 之后将套接字设置为非阻塞。或者您必须处理实现非阻塞连接,这有点棘手。

关于python - 如何使 send() 调用异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60728011/

相关文章:

python - 计算另一个方法中的python方法调用

c - 如何从多个命名管道接收消息?

java - C 内存泄漏与 packetsender 套接字

javascript - 异步代码执行解释

python - 我不明白 Python (2.7.3) 中的编码和解码

python - 在Python中使用后释放缓冲区空间?

python - 根据数据框制作 2 个变量的条形图

java - Python 服务器和 Java 客户端之间的连接被拒绝

java - GORM 对象关系未加载到异步 block 中

node.js - 使用 Sequelize 和 Node 延迟加载静态数据