витой и больше клиентов в сценарии - PullRequest
1 голос
/ 30 мая 2011

Hello
Я новичок в витой, но у меня есть некоторые вопросы после прочтения руководства:
1. Как использовать разные протоколы с разными реакторами в одной программе? (например, txNetTools имеет собственный реактор, а внутренняя поддержка IRC в витой имеет собственный реактор от twisted.internet)
2. Как запустить более одного клиента за один раз? (много клиентов с ping на другой удаленный хост) http://bazaar.launchpad.net/~oubiwann/txnet/trunk/view/head:/sandbox/ping.py
3. Как поместить данные из одного протокола в другой (в одной программе)? Я хочу использовать данные из базы данных в протоколе. (например, каждые 5 минут получать хосты из базы данных и создавать клиентов ping)
Моя задача проста: создать клиент с большим количеством протоколов для множества серверов.

Ответы [ 2 ]

1 голос
/ 30 мая 2011

Как использовать разные протоколы с разными реакторами в одной программе?

Нет.В каждом процессе есть только один реактор, и он может обрабатывать столько соединений, сколько вы хотите.Подавляющее большинство библиотек не предоставляют реактор, и реактор, предоставляемый txNetTools, не является обязательным.Единственное, что он предоставляет, - это метод:

def listenICMP(self, port, protocol, interface="", maxPacketSize=8192):
    p = icmp.Port(port, protocol, interface, maxPacketSize, self)
    p.startListening()
    return p

Если вы хотите использовать другой реактор, вы можете просто создать экземпляр icmp.Port.

Как начать большеодин клиент за один раз?

Точно так же, как вы запускаете один, но повторяется.Например, вот десять одновременных пингеров (включая ответ на первый вопрос):

for i in range(10):
    p = icmp.Port(0, Pinger(), reactor=reactor)
    p.startListening()
reactor.run()

chameco дает прекрасный ответ на последний вопрос.

1 голос
/ 30 мая 2011

Ну, по крайней мере, по третьему вопросу, вы говорите об использовании протоколов разных классов или нескольких экземпляров протоколов одного и того же класса?Экземпляры протокола могут обмениваться данными друг с другом, если фабрика, которая их создает, хранит свои данные, например:

class p(Protocol):
    factory = None
    ...
class f(Factory):
    protocol = p
    data = None
    def buildProtocol(self, addr):
        returnValue = p()
        returnValue.factory = self
        return returnValue

Оттуда вы можете сохранять данные в self.factory.data из экземпляра протоколалюбой другой экземпляр протокола может получить к нему доступ.Я надеюсь, что ответил на ваш вопрос.

...