管理多个Twisted客户端连接
我正在尝试使用Twisted来做一个类似爬虫的程序,这个程序可以管理多个客户端的连接。我希望能同时保持大约5个客户端在工作。每个客户端的功能是连接到一个指定的IRC服务器,这个服务器是从一个列表中获取的,然后进入一个特定的频道,最后把这个频道里的用户列表保存到数据库中。
我遇到的问题主要是架构方面的。我对Twisted还比较陌生,不太清楚有哪些选项可以用来管理多个客户端。我想最简单的方法就是让每个ClientCreator实例在完成工作后就结束,然后有一个中心循环来检查是否有空位可以添加新的客户端。我觉得这个问题并不特别罕见,所以我希望能从其他人的经验中获得一些信息。
3 个回答
我不知道你是不是必须使用Twisted,如果不是的话,你可以试试Gevent。
因为你每个客户都需要更新一个数据库,所以我觉得可以利用一下 连接池
的方式来处理这个问题。想了解更多的话,可以看看这里,这个文档里有很多重要的设计模式,特别是在使用 twisted 的时候经常会用到。
最好的办法其实就是做最简单的事情。不要使用循环或者定时重复调用;只需要有一些处理程序来做正确的事情。
保持一个中心的连接管理对象,并让事件处理方法把它需要的信息传递给它,以便它可以继续工作。当开始时,建立5个外部连接。记录下当前有多少个连接在进行中,并保持一个包含这些连接的列表。当一个连接成功建立时(在 connectionMade
中),更新这个列表,记住连接的新状态。当一个连接完成时(在 connectionLost
中),告诉连接管理器;它的反应应该是移除那个连接,并在其他地方建立一个新的连接。在这个过程中,如何请求你需要的名称并把它们存入数据库应该是相当明显的(在关闭你的IRC连接之前,等待数据库插入完成,通常是通过等待 Deferred
从 adbapi
返回)。