在python中创建一个套接字数组{list}

时间:2015-12-07 06:38:03

标签: python arrays sockets

继续下面链接中提到的问题

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。

2 个答案:

答案 0 :(得分:2)

您不应预填充列表,而是动态创建。

有两种方法可以做到这一点:

  1. “更好”的方式:

    sockets = [socket.socket(socket.AF_INET, socket.SOCK_STREAM) for _ in range(3)]
    for sock in sockets:
         sock.connect((host, port[0]))
    
  2. 劣势:

    sockets = []
    for i in range(3):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect((host, port[0]))
        sockets.append(sock)
    
  3. 尽管有额外的迭代,但第一个更好,因为它使用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))