继续下面链接中提到的问题
list/array of sockets in python
是否可以在python中创建一个套接字数组,如
list=[socket0, socket1, socket2, socket3 ]
for i in range(0,3):
list[i]=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
list[i].connect((host,port[0]))
我尝试了这个但是我收到的错误与我在链接中发布的没有属性recv的错误相同。
是否可以在python中创建这样的数组。我知道这可能在C。
答案 0 :(得分:2)
您不应预填充列表,而是动态创建。
有两种方法可以做到这一点:
“更好”的方式:
sockets = [socket.socket(socket.AF_INET, socket.SOCK_STREAM) for _ in range(3)]
for sock in sockets:
sock.connect((host, port[0]))
劣势:
sockets = []
for i in range(3):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port[0]))
sockets.append(sock)
尽管有额外的迭代,但第一个更好,因为它使用Pythons中的一个“最佳”节目来构建列表,并且更短且更易读。额外迭代的时序要求很低,甚至不存在。
然而,没有任何东西真正反对第二个,所以如果你喜欢它,虽然它更长,使用它。
答案 1 :(得分:0)
最快的方法:
import socket
sockets = list(map(lambda x: x.connect(('127.0.0.1', 80)), [socket.socket(socket.AF_INET, socket.SOCK_STREAM) for _ in range(3)]))
列表理解比使用连续追加或列表[i]创建循环要快, 地图功能也可以。
更漂亮的方式(效率略低):
import socket
not_connected_sockets = [socket.socket(socket.AF_INET, socket.SOCK_STREAM) for _ in
range(3)]
sockets = list(map(lambda x: x.connect(('127.0.0.1',
80)), not_connected_sockets))