Python 处理多个套接字连接的最佳方法是什么

Python 处理多个套接字连接的最佳方法是什么,python,multithreading,sockets,Python,Multithreading,Sockets,我需要做的是根据行的数量从文件中读取x帐户的数量,并制作x我可以随意操作的单个套接字的数量(向IRC和其他任何东西发送消息) 到目前为止,我将如何处理: lines=tuple(open('accts.txt', 'r')) for line in lines: data=line.split(' ',1) a=threading.Thread(target=Spawn,args=(data[0].replace('\n',''),data[1].replace('\n','')

我需要做的是根据行的数量从文件中读取x帐户的数量,并制作x我可以随意操作的单个套接字的数量(向IRC和其他任何东西发送消息)

到目前为止,我将如何处理:

lines=tuple(open('accts.txt', 'r'))
for line in lines:
    data=line.split(' ',1)
    a=threading.Thread(target=Spawn,args=(data[0].replace('\n',''),data[1].replace('\n','')))
    a.start()

#s.send wont work here because it doesn't exist in this context
我试图使用线程,但据我所知,线程似乎不允许您从线程本身的外部访问它们

必须支持线程中的
,而True:
,但如果不可行,我可以不使用它

以下是线程正在创建的Spawn函数:

def Spawn(nick,password):
    Active=True

    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(('irc.boats.gov',6667))
    s.send('PASS '+password+'\r\n')
    s.send('NICK '+nick+'\r\n')
    s.send('JOIN '+channel+'\r\n')

    while True:
        buf=s.recv(1024)
        if('PRIVMSG' in buf):
            sender=buf.split('!',1)[0].split(':')
            message=buf.split(':',2)[2].replace('\n','')
            if(sender[1]==owner):
                if(sender[1]==owner):
                    if(message.strip()=='!stop'):
                        Active=False
                        print '('+nick+')'+' has been disabled'
                    else:
                        if(message.strip()=='!start'):
                            Active=True
                            print '('+nick+')'+' has been enabled'
                        else:
                            if(Active):
                                print 'sent'

如果要创建多个连接,可以按如下方式进行:

from socket import *
SERVER       = ('irc.boats.gov',6667)  # Server address


# Open up connections
connections = []
with open('accts.txt', 'r') as f:
    for line in f:
        s = socket(AF_INET,SOCK_STREAM)
        s.connect(SERVER)
        connections.append(s)
        s.send('PASS '+password+'\r\n')
        s.send('NICK '+nick+'\r\n')
        s.send('JOIN '+channel+'\r\n')
然后,您可以使用模块对它们执行任何操作。线程在这里帮助不大,甚至会降低性能。您也可以按照建议尝试Twisted或使用多个进程


从David Beazley关于并发性的文章中,我改编了其中的代码。

您计划同时打开多少个套接字?如果它们可以变成数千个,我们就可以超过线程数量的实际限制。换成twisted怎么样?@olivecoder只有20-30个,如果是这样的话,你有select的例子吗?它的用途似乎令人困惑