gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:52:47 25 4
gpt4 key购买 nike

服务器作为 nc -l 1234 运行

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

客户端.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()

事件循环.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com