python socket connect 阻塞_python – 如何获得非阻塞socket connect()?

本文介绍了如何在Python中处理socket连接的阻塞问题,建议使用asyncore模块的dispatcher类创建非阻塞连接,并提供了示例代码。通过这种方法,可以在连接到多个服务器时避免阻塞,同时展示了asyncore.loop()如何处理连接和读取数据。
摘要由CSDN通过智能技术生成

您还需要并行连接,因为设置超时时套接字会阻塞.或者,您无法设置超时,并使用选择模块.

您可以使用asyncore模块中的dispatcher类来执行此操作.看看基本的http client example.该类的多个实例将不会在连接时阻止对方.您可以轻松地使用线程来做到这一点,我认为使跟踪套接字超时更容易,但是由于您已经在使用异步方法,您可能会保持在同一个轨道上.

作为一个例子,以下工作在我所有的linux系统上

import asyncore, socket

class client(asyncore.dispatcher):

def __init__(self, host):

self.host = host

asyncore.dispatcher.__init__(self)

self.create_socket(socket.AF_INET, socket.SOCK_STREAM)

self.connect((host, 22))

def handle_connect(self):

print 'Connected to', self.host

def handle_close(self):

self.close()

def handle_write(self):

self.send('')

def handle_read(self):

print ' ', self.recv(1024)

clients = []

for i in range(50, 100):

clients.append(client('cluster%d' % i))

asyncore.loop()

在cluster50 – cluster100中,有许多机器无响应或不存在.这样立即开始打印:

Connected to cluster50

SSH-2.0-OpenSSH_4.3

Connected to cluster51

SSH-2.0-OpenSSH_4.3

Connected to cluster52

SSH-2.0-OpenSSH_4.3

Connected to cluster60

SSH-2.0-OpenSSH_4.3

Connected to cluster61

SSH-2.0-OpenSSH_4.3

...

然而,这并不考虑getaddrinfo,它必须阻止.如果您在解决dns查询时遇到问题,则必须等待.您可能需要单独收集dns查询,并在异步循环中使用ip地址

如果你想要一个比asyncore更大的工具包,请查看Twisted Matrix.进去有点沉重,但它是最好的网络编程工具包,你可以获得python.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值