如何处理多个socket连接的最佳方法。

3
我需要做的是基于文件行数读取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

我尝试使用线程,但据我所知,线程不允许从外部访问它们。

必须在线程中支持 while 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'

你计划同时打开多少个套接字?如果它们可能会变成数千个,我们可能会超出线程数量的实际限制。 - olivecoder
那么用 Twisted 怎么样? - olivecoder
@olivecoder 只需要20-30,甚至可能更少。 - KekMeister Johhny
1个回答

1
如果您想创建多个连接,可以按照以下方式进行:
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')

然后,您可以使用select模块等方式随意处理它们。线程在这里并没有太大帮助,甚至可能会降低性能。您还可以尝试Twisted,如建议的那样,或使用多个进程。 这是David Beazley关于并发性的一个不错的相关阅读材料,我从中改编了代码。

你有一个使用select的例子吗?它看起来很困惑。 - KekMeister Johhny
这个程序使用select.select。你可以在这里找到它的链接:http://www.dabeaz.com/coroutines/blaster.py - dkol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接